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

本文关键字:应用程序 多线程 饥饿 内存 控制 | 更新日期: 2023-09-27 18:21:37

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

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

如果线程数量过大,应用程序就会失控,耗尽所有可用内存并挂断。。利用所有CPU+RAM功能的最有效方法是什么(高性能计算,即12Cores/16GB RAM)而不让系统屈服

我必须指定我有一个包含N个工人的工人缓冲队列,每次一个工人完成并死亡时,都会通过队列启动一个新的工人。到目前为止,这个效果还不错。但我希望避免"手动"answers"凭经验"设置同时运行的线程数,并拥有一个智能可扩展系统,该系统可以一次丢弃尽可能多的线程,并在"合理"的内存使用率下停止(目标服务器专用于应用程序,因此除了系统之外,其他应用程序都没有问题)

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

PS 2:看完这篇文章后,我对"不要这样做"的回答有点困惑。尽管我认为这样的要求对于一个需要内存的计算程序来说是公平的。

编辑
看完这篇文章后,我将尝试使用WMI功能

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

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

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

  1. 在启动新任务之前,请查看系统上的可用内存量。如果它低于500mb,请等待释放出足够的
  2. 在任务到来时启动任务,并在其中一些任务因OOM而开始失败时进行节流。稍后重新启动它们。这种替代方案非常耗时,因为您的流程会疯狂地进行垃圾收集以避免OOM

我推荐(1)。

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

如果你在16GB的系统上留出1GB的缓冲区,你可以以94%的效率运行,而且非常安全。