如何衡量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测试。

其他回答

基于对相关问题的回答。

您可以使用SNMP获取网络上特定设备中进程的内存和CPU使用情况:)

要求:

运行进程的设备应安装并运行snmpsnmp应该配置为接受来自运行以下脚本的请求(可以在文件snmpd.conf中配置)您应该知道要监视的进程的进程ID(PID)

笔记:

HOST-ROURCES-MIB::hrSWRunPerfCPU是此进程消耗的系统CPU资源总量的秒数。请注意,在多处理器系统上,该值可能在实际(墙上时钟)时间的一厘秒内增加超过一厘秒。HOST-ROURCES-MIB::hrSWRunPerfMem是分配给此进程的实际系统内存总量。

过程监控脚本

echo "IP address: "
read ip
echo "Specfiy PID: "
read pid
echo "Interval in seconds: "
read interval

while [ 1 ]
do
    date
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
    sleep $interval;
done

以下命令行将以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}'

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

cat /proc/1234/smaps

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

使用ps或类似工具,您只能获得该进程分配的内存页数量。此数字正确,但:

不反映应用程序使用的实际内存量,只反映为其保留的内存量如果页面被共享,例如由多个线程共享或使用动态链接库共享,则可能会产生误导

如果您真的想知道应用程序实际使用的内存量,则需要在探查器中运行它。例如,Valgrind可以让您了解所使用的内存量,更重要的是,了解程序中可能的内存泄漏。Valgrind的堆轮廓仪工具称为“massif”:

Massif是一个堆分析器。它通过定期拍摄程序堆的快照来执行详细的堆分析。它会生成一个图表,显示一段时间内的堆使用情况,包括程序中哪些部分负责最多内存分配的信息。该图由文本或HTML文件补充,该文件包含更多信息,用于确定分配最多内存的位置。Massif运行程序的速度比正常速度慢20倍。

如Valgrind文档中所述,您需要通过Valgrind运行程序:

valgrind --tool=massif <executable> <arguments>

Massif写入内存使用快照的转储(例如Massif.out.1245)。这些快照提供(1)内存使用的时间线,(2)每个快照的程序内存分配位置的记录。分析这些文件的一个很好的图形工具是massif可视化工具。但我发现,与Valgrind一起提供的基于文本的简单工具ms_print已经有了很大的帮助。

要查找内存泄漏,请使用valgrind的(默认)memcheck工具。

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

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

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

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