我有一个内部 C++ 应用程序,它会无限增长——以至于我们不得不实现一旦 RSS 达到某个峰值大小 (2.0G) 时实际上会杀死它的逻辑,只是为了保持某种秩序。但是,这显示了一些奇怪的行为。
首先,我通过 Valgrind w/memcheck 运行应用程序,并修复了一些随机内存泄漏。但是,这些内存泄漏的程度以 10 兆字节为单位。这是有道理的,因为可能没有实际的内存泄漏——这可能只是应用程序端的内存管理不善。
接下来,我使用 Valgrind w/massif 来检查内存的去向,这就是它变得奇怪的地方。峰值快照为 161M——与我们使用 RSS 字段看到的 1.9G+ 峰值相差甚远。最大的消耗是我所期望的——在 std::string 中——但这并不异常。
最后,这是最令人费解的——在我们意识到这个内存泄漏之前,我实际上是在 AWS 上测试这个服务,只是为了好玩,在 CC2.8XL 机器上将工作人员的数量设置为一个很高的数字,44工人。那是 60.5G 的 RAM,没有交换。快进一个月:我去看主机——低头看,它的内存已经用完了——但是!这些进程仍然运行良好,并且卡在内存使用的不同阶段——几乎均匀分布在 800M 到 1.9G 之间。每隔一段时间就会dmesg
打印出关于无法分配内存的 Xen 错误,但除此之外,进程永远不会死亡并继续积极处理(即,它们没有“卡住”)。
我在这里缺少什么吗?它基本上可以工作,但对于我的生活,我不知道为什么。关于下一步要寻找什么,有什么好的建议?有什么工具可以帮助我弄清楚吗?