如何测量应用程序或进程的实际内存使用情况?
这个问题在这里详细介绍。
如何衡量Linux中应用程序或进程的内存使用情况?
从理解Linux上内存使用的博客文章中, ps
不是一个准确的工具,可用于此目的。
为什么ps
是“错误的”
根据你如何看待它, ps
不报告进程的实际内存使用情况。 它真正在做的是如果它是唯一的进程运行,则显示每个进程将占用多少真实内存。 当然,典型的Linux机器在任何时候都有数十个进程在运行,这意味着由ps
报告的VSZ和RSS数字几乎肯定是错误的。
使用ps
或类似的工具,您只能获得该进程分配的内存页面数量。 这个数字是正确的,但是:
并不反映应用程序使用的实际内存量,而只是为其保留的内存量
如果页面被共享,例如通过多个线程或通过使用动态链接的库,可能会引起误解
如果您真的想知道应用程序实际使用的内存量,则需要在分析器中运行它。 例如, valgrind
可以为您提供有关所用内存量的更多信息,更重要的是,可以提供有关程序中可能的内存泄漏的信息。 valgrind的堆分析器工具被称为'massif':
Massif是一个堆分析器。 它通过定期获取程序堆的快照来执行详细的堆分析。 它会生成一个图表,显示堆的使用情况,包括有关程序的哪些部分负责大部分内存分配的信息。 该图由一个文本或HTML文件进行补充,其中包含更多信息以确定分配最多内存的位置。 地块运行程序比正常慢20倍左右。
正如valgrind文档中所述,您需要通过valgrind运行该程序:
valgrind --tool=massif <executable> <arguments>
Massif写入内存使用快照转储(例如massif.out.12345
)。 这些提供(1)内存使用的时间线,(2)为每个快照记录程序内存分配的位置。 分析这些文件的一个很好的图形工具是massif-visualizer。 但是我发现ms_print
是valgrind附带的一个简单的基于文本的工具,已经有了很大的帮助。
要查找内存泄漏,请使用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链接地址: http://www.djcxy.com/p/14065.html
上一篇: How to measure actual memory usage of an application or process?