如何衡量Linux中应用程序或进程的内存使用情况?

在博客文章《了解Linux上的内存使用情况》中,ps并不是一个准确的工具。

为什么ps是“错误的”根据您的看法,ps不会报告进程的实际内存使用情况。它真正要做的是显示如果只有一个进程在运行,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误的。

(注:这里详细介绍了这个问题。)


当前回答

#!/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

其他回答

还有三种方法可以尝试:

ps aux—排序设备它按%MEM对输出进行排序。ps aux | awk“{打印$2,$4,$11}”|排序-k2r |头-n 15它使用管道进行排序。顶部-a它开始按%MEM排序

(摘自此处)

去找Valgrind。让它运行你的程序,它会告诉你它的内存使用情况。

这只适用于程序运行一段时间并停止的情况。我不知道Valgrind是否能够控制一个已经运行的进程,或者不应该停止的进程,比如守护进程。

/prox/xxx/numa_maps提供了一些信息:N0=???N1=???。但这个结果可能低于实际结果,因为它只计算那些被触摸过的对象。

对此没有一个单一的答案,因为您无法精确指出进程使用的内存量。Linux下的大多数进程使用共享库。

例如,假设您想计算“ls”进程的内存使用情况。是否只计算可执行文件“ls”使用的内存(如果可以隔离它)?libc怎么样?或者运行“ls”所需的所有其他库?

linux-gate.so.1 =>  (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

您可能会认为它们是由其他进程共享的,但“ls”在未加载的情况下无法在系统上运行。

此外,如果您需要知道一个进程需要多少内存来进行容量规划,则必须计算该进程的每个额外副本使用多少内存。我认为/proc/PID/status可能会在一次提供足够的内存使用信息。另一方面,Valgrind将在程序的整个生命周期内为您提供更好的内存使用情况。

给出了一些答案(感谢thomas rutter),为了获得单个应用程序的实际交换和RAM,我提出了以下建议,说我们想知道“firefox”在使用什么

sudo smem|awk'/firefox/{swap+=$5;pss+=$7;}END{print“swap=”swap/1024“pss=”pss/1024}'

或者libvirt;

sudo smem|awk'/libvirt/{swap+=$5;pss+=$7;}END{print“swap=”swap/1024“pss=”pss/1024}'

这将为您提供以MB为单位的总计;

交换=0 PSS=2096.92

交换=224.75 PSS=421.455

在ubuntu 16.04至20.04测试。