在具有多个线程的Linux上,Mono 4.2.2垃圾收集真的很慢/泄漏?

时间:2016-02-07 19:05:07

标签: multithreading mono garbage-collection

我有一个应用程序可以将3 + GB的数据处理成300MB的数据。在主线程上顺序运行每个独立数据集,其内存使用率最高可达3.5GB,并且工作正常。

如果我在10个线程上同时运行每个数据集,我会看到以下内容:

  • 虚拟内存使用量稳步攀升,直到分配失败并崩溃。我可以看到GC正试图在堆栈跟踪中运行)
  • 对于句点,CPU利用率为1000%,然后在几分钟内降至100%,然后重新启动。当使用多个线程运行时,该应用程序很容易10x 较慢,即使它们是完全独立的。

这是针对具有大堆支持的Linux的单声道4.2.2版本,在具有40个逻辑处理器的128GB RAM上运行。我正在运行mono-sgen并尝试了我能想到的所有自定义GC设置(并发标记扫描,最大堆大小等)。

Windows上不会发生这些问题。如果我重写代码来执行重要的对象池,那么在运行OOM之前我会在数据集中得到更多,但命运是相同的。我已经使用多个工具和古老的printf调试验证了我没有内存泄漏。

我最好的理论是,许多线程的大量分配对于GC来说都是一个弱点,并且大多数挂钟时间花费在我的工作线程暂停上。

有没有人有这方面的经验?有没有办法可以帮助GC摆脱100%的车祸而陷入困境,并且不会耗尽内存?

0 个答案:

没有答案