这个问题在这里详细介绍。
您如何在 Linux 中测量应用程序或进程的内存使用情况?
从了解 Linux 上的内存使用的博客文章中, ps
不是用于此目的的准确工具。
为什么
ps
是 “错误的”根据您的看法,
ps
不会报告进程的实际内存使用情况。它的实际作用是显示如果每个进程是唯一运行的进程,则每个进程将占用多少实际内存。当然,一台典型的 Linux 机器在任何给定时间都运行着几十个进程,这意味着ps
报告的 VSZ 和 RSS 编号几乎肯定是错误的。
使用ps
或类似工具,您将只获得该进程分配的内存页数量。该数字是正确的,但是:
不反映应用程序实际使用的内存量,仅反映为其保留的内存量
如果页面是共享的(例如由多个线程共享或通过使用动态链接的库)可能会产生误导
如果您真的想知道您的应用程序实际使用了多少内存,则需要在分析器中运行它。例如, Valgrind可以为您提供有关已用内存量的信息,更重要的是,您可以了解程序中可能的内存泄漏。 Valgrind 的堆分析器工具称为 “massif”:
Massif 是堆分析器。它通过对程序堆进行定期快照来执行详细的堆分析。它生成一个图表,显示一段时间内的堆使用情况,包括有关程序的哪些部分负责最多内存分配的信息。该图由文本或 HTML 文件补充,该文本或 HTML 文件包含更多信息,用于确定将最大内存分配到的位置。 Massif 运行的程序比正常运行慢约 20 倍。
如 Valgrind 文档中所述,您需要通过 Valgrind 运行程序:
valgrind --tool=massif <executable> <arguments>
Massif 写入内存使用情况快照的转储(例如massif.out.12345
)。这些提供(1)内存使用的时间轴,(2)每个快照,记录程序内存中分配位置的记录。 massif-visualizer是分析这些文件的一种出色的图形工具。但是我发现ms_print
这个 Valgrind 附带的简单的基于文本的工具已经很有帮助了。
要查找内存泄漏,请使用memcheck
工具。
尝试使用pmap命令:
sudo pmap -x <process pid>
很难确定,但是这里有两个可以帮助的 “接近” 的事情。
$ ps aux
将为您提供虚拟尺寸(VSZ)
/proc/$pid/status
从 / proc文件系统中获取详细的统计信息。
最重要的是 VmSize,它应该接近ps aux
提供的值。
/proc/19420$ cat status Name: firefox State: S (sleeping) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 256 Groups: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 VmPeak: 222956 kB VmSize: 212520 kB VmLck: 0 kB VmHWM: 127912 kB VmRSS: 118768 kB VmData: 170180 kB VmStk: 228 kB VmExe: 28 kB VmLib: 35424 kB VmPTE: 184 kB Threads: 8 SigQ: 0/16382 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000020001000 SigCgt: 000000018000442f CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 03 Mems_allowed: 1 voluntary_ctxt_switches: 63422 nonvoluntary_ctxt_switches: 7171