如何使用写入时复制来最小化 C++ 程序的内存消耗



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

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

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

您可以使用vmstatsystemtap和/或glibcmalloc-hooks来监视消耗。您可以使用perf查看故障发生的位置,以了解消耗的实际影响。

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

您还可以使用 madvise 从进程中告诉内核您可能要对分配的内存执行的操作。

最新更新