这是一个非常难看的问题。
我有一个C ++程序,它在循环中执行以下操作:
我的程序(让我们称之为“Bob”)有一个相当严重的内存泄漏。内存泄漏位于其他人编写的共享库中,我必须使用它,但是我无法访问的源代码。
此内存泄漏导致Bob在循环的“计算某些数据”阶段期间崩溃。这是一个问题,因为另一个程序正在等待Bob的响应,如果它没有收到响应,将会非常沮丧。
由于各种限制(是的,这是一个X / Y问题,我告诉你它很难看),我已经确定我唯一可行的策略是修改Bob以便它在循环中执行以下操作:
我的问题如下:
检测我们是否使用“太多”内存的最佳(可靠但不太低效)方法是什么?我目前的想法是将getrlimit(RLIMIT_AS) rlim_cur
与getrusage(RUSAGE_SELF) ru_maxrss
进行比较;那是对的吗?如果没有,有什么更好的方法? Bob在各种主机上的Linux VM中运行,所有主机都有不同的内存。
答案 0 :(得分:1)
假设在“计算某些数据”阶段发生内存泄漏,我认为将该部分重构为单独的程序并在其自己的进程中执行该操作可能更有意义。这样你至少可以隔离有问题的代码,并在将来更容易替换它,而不是仅仅通过让程序在内存不足时重新启动来掩盖问题。
“计算一些数据”部分可以是一个长时间运行的进程,等待来自主程序的请求并在必要时重新启动,或者(甚至更简单)它可能是一个完成的程序,只需要其数据位于*argv
,并将结果发送至stdout
。然后你的主循环可以只是分叉并每次执行它,并在它们返回时读取结果。如果可能的话,我会选择更简单的选项,但这当然取决于你的需求。
答案 1 :(得分:0)
如果你让程序本身重启或分叉"计算一些数据"在一个单独的过程中,无论如何你都需要检查内存消耗。由于您使用的是Linux,因此检查此问题的简便方法是获取感兴趣的进程的pid编号,并读取文件/proc/$PID/statm
的内容。第二个数字是居民集的大小。
读取这些proc文件是top和htop等工具获取进程数据的方式。定期读取一个~30字节的内存文件以检查内存泄漏听起来效率太低。
如果泄漏是常规的,并且您希望使其更复杂,您甚至可以跟踪增长率并相应地调整检查率。