通过跟踪 top 中的“free”和“cached”来确认是否存在内存泄漏?

通过跟踪 top 中的“free”和“cached”来确认是否存在内存泄漏?

我正在尝试确认我的 Linux 设备在空闲状态下是否存在内存泄漏(不应有持续的内存消耗)。我并不想知道导致泄漏的进程,只是想确定内存泄漏的结论。

我将其用作top诊断工具。内存字段示例从顶部开始:

Mem:    118616k total,    83980k used,    34636k free,        0k buffers
Swap:        0k total,        0k used,        0k free,    24140k cached

我可以看到不断下降的价值,但是,也可以看到不断增加free的价值。cached

为了确认存在内存泄漏,总和free+cached应该持续下降而不是仅仅free减少(在这种情况下内核可能只是使用可用内存进行缓存)?

答案1

没有办法知道您是否有内存泄漏。您可以根据对系统和程序的了解来假设它。我会检查文件/proc/meminfo,获取值MemFree并在某些时间间隔内检查它。如果它总是在减少,那么在经过一些间隔后,我应该断言存在内存泄漏。

  • cat /proc/meminfo | gawk '{if (/MemFree/ ~ $0) print $2}'

但据我所知,没有办法检查“全局”内存泄漏。等待其他答案;)

答案2

用户空间进程的内存泄漏会导致这个流程

你可以使用批处理模式下的 top 来监视进程(但是,top 似乎不支持批处理模式下按内存排序,https://bugzilla.redhat.com/show_bug.cgi?id=547749

作为 top 的替代,您也可以每分钟执行以下命令:

ps aux --sort -rss | head -n 10

查看使用 RAM 的前 10 个进程。

例如

while [ true ]; do ps aux --sort -rss | head -n 10 >> memory_usage_log.txt; echo "#########" >> memory_usage_log.txt; sleep 60; done;

如果某个进程随着时间的推移使用越来越多的 RAM,而没有活动或输入数据,那么它可能是一个内存泄漏(例如,如果你启动一个网络浏览器并在不使用它的情况下保持它运行,那么网络浏览器的内存使用量显然不应该随着时间的推移而增长)。

相关内容