【问题标题】:How to minimize memory consumption of c++ program using copy-on-write?如何使用写时复制来最小化 c++ 程序的内存消耗?
【发布时间】:2012-11-16 11:42:16
【问题描述】:

我正在开发一个应用程序,该应用程序最多可分叉 8 次以实现并行性。每个分叉都有一个来自分叉时原始进程的内存空间的完整副本。分叉很快,因为 Linux 在进程之间共享页面,并且仅在修改时创建新页面。实际上,我的应用程序的内存消耗增长似乎大约是 3 倍。对于用于识别会降低增长的更改的工具或技术有什么建议吗?

一个想法是查看修改页面的页面碎片。还只是对分叉进程中分配的内容进行了蛮力检查。无论哪种情况,您都可以推荐哪些技术或工具来执行该分析?

请记住,即使使用并行性,该程序也需要几个小时才能完成,并且内存占用量高达 1TB,因此检测选项有限。

【问题讨论】:

  • 需要分叉吗?您不妨为并行性创建不同的线程,并且所有线程都将共享相同的内存(具有所有含义)
  • 一个非常笼统的建议,但您可以尝试使用池分配器(或类似的)将您将在多个进程中写入的内存与分叉发生后保持不变的内存分开。由于 COW 一次完成一个内存页,任何与您修改的内存混合的只读内存都会导致不必要的重复。由于避免从假定的只读分配器修改内存并不重要,因此即使您事先不确定哪个内存是哪个,启发式方法仍可能有所帮助。

标签: c++ linux memory optimization profiling


【解决方案1】:

您可以使用vmstatsystemtapglibcmalloc-hooks 来监控消耗。 您可以使用perf查看故障发生在哪里,以了解消耗的实际影响。

如果您的应用程序在使用大内存池时面临 TLB 压力(例如,您正在处理大量数据),您可以使用大/大页面来减轻 4k 页面的开销。

您还可以使用madvise 从您的进程中告诉内核您可能要对分配的内存做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多