2

我正在使用 WMI 来监控数百台主机。我大约每 5 秒轮询一次 CPU 使用率。我正在使用 C# 的线程池来运行当前计划的适当 WMI 查询。通常,运行查询的线程不超过 30 个左右。有时会有 16 秒的间隔,而不是 5 秒,没有可见的 CPU 使用率。由于 CPU 未得到充分利用,我怀疑瓶颈在 RPC 或 TCP/IP 堆栈中。但是我认为它不是 TCP/IP 堆栈,因为连接是永久保持打开的。所以我怀疑瓶颈在监控机器上的 RPC 中。

我可以在监控机器上进行任何 RPC 调整吗?

更新 1:

在发布之前,我已经进行了一些 .NET 调整。我已经调整了ThreadPoolThreadPool.SetMinThreads(200, 200)调用ThreadPool.SetMaxThreads(300,300)。我正在使用这些Task对象,所有这些都是用TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness.

4

1 回答 1

2

我正在使用 C# 的线程池

如果您正在运行执行大量阻塞和很少执行的代码,这不是一个好主意。就像 WMI 查询一样。线程池调度程序尝试将执行线程的数量限制为机器上的核心数量。这是一种优化,它减少了线程上下文切换的开销。但它无法预测或检测到线程实际上并未执行代码。它有一个自适应调度算法来处理它,当现有线程没有完成时允许额外的线程执行,但运行缓慢。

您可以调用 ThreadPool.SetMinThread() 来增加允许并发执行的线程数。默认值为核心数。将其增加到 30 可以解决您的问题,但会产生全局副作用。使用 Thread 代替线程池是一种本地解决方案。

于 2012-04-18T16:11:52.633 回答