我正在使用WMI监控数百个主机。我大约每5秒就轮询CPU的使用情况。我使用C#的线程池来运行当前计划的适当WMI查询。通常情况下,运行这些查询的线程不超过30个。有时会出现16秒的间隔,而不是5秒,没有可见的CPU使用。由于CPU利用率不足,我怀疑瓶颈在RPC或TCP/IP堆栈中。然而,我认为这不是TCP/IP堆栈,因为连接是永久打开的。所以我怀疑监控机器上的瓶颈在RPC中。
我能在监控机器上做什么RPC调优吗?
更新1:
在发布之前,我已经做了一些.NET调优。我对ThreadPool进行了ThreadPool.SetMinThreads(200, 200)和ThreadPool.SetMaxThreads(300,300)调用的调优。我正在使用Task对象,这些对象都是用TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness创建的。
发布于 2012-04-18 16:11:52
我正在使用C#的线程池
这不是一个好主意,如果您正在运行的代码做了大量的阻塞和很少执行。就像WMI查询。线程池调度程序试图将执行线程的数量限制在计算机上的核心数量上。这是一种优化,它减少了线程上下文交换机损失的开销。但是它不能预测或检测线程实际上没有执行代码。它有一个自适应的调度算法来处理它,允许在现有线程尚未完成时执行额外的线程,但执行速度很慢。
您可以调用ThreadPool.SetMinThread()来增加允许并发执行的线程数。缺省值是核的数量。增加到30,可以解决你的问题,但有全球性的副作用。使用线程而不是线程池是一个本地解决方案。
https://stackoverflow.com/questions/10211074
复制相似问题