问候。
我有一个.NET应用程序并行运行一堆模拟。它正在进行参数扫描,因此每个参数都有自己的Parallel.Foreach
循环。我通常将最大并行度设置为除了一个循环之外的所有循环,以保持内存需求下降,因为每个参数可以采用比我可用内核更多的值(4)。
应用程序完全受CPU限制,最后只有I / O才能写出结果。我只在数据结构周围有一个锁定捕获结果,但很少访问(每隔几秒一次)。无论我在多大程度上推动并行性(通过控制环路上的最大并行度),我总是得到大约50%的平均CPU使用率(~2个核心)。
我想找出阻止更高CPU使用率的因素。我的猜测是:1)一些调用同步的.NET库,从而序列化调用。 2)GC踩到清理资源(应用程序生成了很多垃圾)。
有关如何进行调查的任何想法?
非常感谢。
答案 0 :(得分:2)
我认为多线程问题的调试总是需要有关代码细节的知识,所以没有一般的配方。但我认为GC是一个非常好的第一猜测。你有没试过这个:
http://msdn.microsoft.com/en-us/library/ms229357.aspx
我遇到了类似的问题,并且使用gcServer允许它将CPU(8个核心)推到极限。