如何衡量Linux中应用程序或进程的内存使用情况?
在博客文章《了解Linux上的内存使用情况》中,ps并不是一个准确的工具。
为什么ps是“错误的”根据您的看法,ps不会报告进程的实际内存使用情况。它真正要做的是显示如果只有一个进程在运行,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误的。
(注:这里详细介绍了这个问题。)
如何衡量Linux中应用程序或进程的内存使用情况?
在博客文章《了解Linux上的内存使用情况》中,ps并不是一个准确的工具。
为什么ps是“错误的”根据您的看法,ps不会报告进程的实际内存使用情况。它真正要做的是显示如果只有一个进程在运行,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误的。
(注:这里详细介绍了这个问题。)
当前回答
使用Ubuntu中提供的内置System Monitor GUI工具。
其他回答
没有任何简单的计算方法。但有些人试图得到一些好的答案:
ps_mem.pyGitHub上的ps_mem.py
我建议您使用top。你可以在这个页面上找到关于它的一切。它能够为您的流程提供所有必要的KPI,还可以捕获到文件中。
很难确定,但有两件“接近”的事情可以帮助我们。
$ 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
#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#
IFS=$'\n'
for line in $(</proc/$1/smaps)
do
[[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))
done
print $kb
如果进程没有占用太多内存(可能是因为您希望是这样,或者其他命令给出了这个初始指示),并且进程可以承受短时间的停止,您可以尝试使用gcore命令。
gcore <pid>
检查生成的核心文件的大小,以了解特定进程正在使用多少内存。
如果进程使用数百兆字节或千兆字节,这将不会太好,因为根据I/O性能,核心生成可能需要几秒钟或几分钟才能创建。在核心创建过程中,进程被停止(或“冻结”)以防止内存更改。所以要小心。
还要确保生成核心的装载点有足够的磁盘空间,并且系统不会对在该特定目录中创建的核心文件做出负面反应。