【发布时间】:2012-02-21 05:43:16
【问题描述】:
这是一个非常开放的问题。
基本上,我有一个计算应用程序,可以启动 N 个场景的测试组合。
每个测试都在一个专用线程中进行,包括读取大型二进制数据、对其进行处理并将结果放入数据库。
如果线程数太大,应用程序会变得流氓,耗尽所有可用内存并挂起。 利用所有 CPU+RAM 功能的最有效方法是什么(高性能计算,即 12 核/16GB RAM)不会让系统崩溃(如果“启动了太多”并发线程,“太多”当然是一个相对概念)
我必须指定我有一个包含 N 个工人的工人缓冲区队列,每次一个人完成并死亡时,都会通过队列启动一个新的人。到目前为止,这工作得很好。但我想避免“手动”和“凭经验”设置同时线程的数量,并拥有一个智能的可扩展系统,该系统在系统可以正确处理的情况下一次丢弃尽可能多的线程,并停止在“合理”的内存使用(目标服务器专用于应用程序,因此除了系统之外的其他应用程序没有问题)
PS:我知道 .Net 3.5 带有线程池,而 .Net 4 具有有趣的 TPL 功能,我现在仍在考虑这些功能(到目前为止我还没有深入研究过)。
PS 2:阅读this post 后,我对“不要这样做”的答案感到有些困惑。虽然我认为这样的要求对于内存要求很高的计算程序来说是公平的。
编辑
看完this post我会尝试使用WMI features
【问题讨论】:
-
线程池从1.0开始就在.NET中
-
如果最大化性能是唯一目标,对我来说听起来很简单。您永远不想拥有比 CPU 内核更多的线程。如果事实证明您没有足够的 RAM,则硬件不平衡。添加更多内存。不要忘记现实检查,实际检查所有核心是否达到 100%。如果不是,那么线程不是解决方案。使用太多线程只会产生问题。
-
@HansPassant 确实如此,但前提是线程不阻塞(文件 i/o 等),如果有更多可能有助于保持性能。
-
@kenny - 如果有阻塞线程,那么瓶颈就在其他地方。总是 I/O。添加更多线程不会使 I/O 更快。
-
@HansPassant true,但它可以让CPU做其他未被阻塞的操作。
标签: c# .net performance