协慌网

登录 贡献 社区

如何测量应用程序或进程的实际内存使用情况?

这个问题在这里详细介绍。

您如何在 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