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

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

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

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


当前回答

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

其他回答

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

ps_mem.pyGitHub上的ps_mem.py

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

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

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

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

在最新版本的Linux中,使用smaps子系统。例如,对于PID为1234的进程:

cat /proc/1234/smaps

它会确切地告诉你当时它使用了多少内存。更重要的是,它将把内存分为私有和共享,这样你就可以知道你的程序实例使用了多少内存,而不包括程序的多个实例之间共享的内存。

这里再次投票支持Valgrind,但我想补充一点,您可以使用Alleyoop这样的工具来帮助您解释Valgrind生成的结果。

我一直使用这两种工具,并且总是有简洁、无泄漏的代码来自豪地展示它;)

我正在使用Arch Linux,有一个很棒的软件包叫做ps_mem:

ps_mem -p <pid>

示例输出

$ ps_mem -S -p $(pgrep firefox)

Private   +   Shared  =  RAM used   Swap used   Program

355.0 MiB +  38.7 MiB = 393.7 MiB    35.9 MiB   firefox
---------------------------------------------
                        393.7 MiB    35.9 MiB
=============================================