控制内存饥饿的多线程应用程序

时间:2012-01-28 16:21:45

标签: c# .net performance

这是一个非常开放的问题。

基本上,我有一个计算应用程序,可以为N场景启动测试组合 每个测试都在一个专用线程中进行,包括读取大型二进制数据,处理它,并将结果丢弃到DB。

如果线程数太大,应用程序会变得流氓并且会耗尽所有可用内存并挂起.. 利用所有CPU + RAM功能的最有效方法是什么(高性能计算,即12核/ 16GB RAM)不会让系统瘫痪(如果“太多“同时发布的线程”,太多“当然是一个相对的概念”

我必须指定我有一个包含N个工作人员的工作缓冲队列,每次完成并死亡时,新的工作通过队列启动。到目前为止,这个工作非常好。但我想避免“手动”和“凭经验”设置同时线程的数量,并拥有一个智能可扩展系统,在系统可以正确处理的同时丢弃尽可能多的线程,并停在一个“合理的”内存使用(目标服务器专用于应用程序,因此除了系统之外的其他应用程序没有问题)

PS:我知道.Net 3.5附带了线程池,而.Net 4具有有趣的TPL功能,我现在仍在考虑(到目前为止我从未深入研究过)。

PS 2:看完this post后,我对“不要这样做”的答案感到有些困惑。虽然我认为这样的要求对于要求内存的计算程序来说是公平的。

编辑
阅读this post后,我将尝试使用WMI features

1 个答案:

答案 0 :(得分:1)

.NET中的所有内置线程功能都不支持根据内存使用情况进行调整。你需要自己构建它。

您可以预测内存使用情况,也可以对内存不足情况做出反应。备选方案:

  1. 在启动新任务之前查看系统上的可用内存量。如果它低于500mb,请等到有足够的空间被释放。
  2. 当他们中的一些人因为OOM而开始失败时,他们会立即启动任务。稍后重启它们。这个替代方案很糟糕,因为你的进程会疯狂地进行垃圾收集以避免OOM。
  3. 我推荐(1)。

    您可以查看免费系统内存或您自己的进程内存使用情况。为了获得内存使用量,我建议使用Process类查看专用字节。

    如果你在16GB系统上留出1GB的缓冲区,那么你的效率会达到94%并非常安全。