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

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

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

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


当前回答

以下命令行将以MB为单位显示在Linux机器上运行的各种进程所使用的总内存:

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + $1} END {print total}'

其他回答

没有任何简单的计算方法。但有些人试图得到一些好的答案:

ps_mem.pyGitHub上的ps_mem.py

给出了一些答案(感谢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测试。

如果您的代码是C或C++,您可能可以使用getrusage(),它会返回有关进程内存和时间使用情况的各种统计信息。

但并非所有平台都支持这一点,并将为内存使用选项返回0值。

相反,您可以查看在/proc/[pid]/statm中创建的虚拟文件(其中[pid]被您的进程id替换)。

此文件看起来像一个包含7个整数的文本文件。您可能对该文件中的第一个(所有内存使用)和第六个(数据内存使用)数字最感兴趣。

以下命令行将以MB为单位显示在Linux机器上运行的各种进程所使用的总内存:

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + $1} END {print total}'

我建议您使用top。你可以在这个页面上找到关于它的一切。它能够为您的流程提供所有必要的KPI,还可以捕获到文件中。