如何衡量Linux中应用程序或进程的内存使用情况?
在博客文章《了解Linux上的内存使用情况》中,ps并不是一个准确的工具。
为什么ps是“错误的”根据您的看法,ps不会报告进程的实际内存使用情况。它真正要做的是显示如果只有一个进程在运行,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误的。
(注:这里详细介绍了这个问题。)
如何衡量Linux中应用程序或进程的内存使用情况?
在博客文章《了解Linux上的内存使用情况》中,ps并不是一个准确的工具。
为什么ps是“错误的”根据您的看法,ps不会报告进程的实际内存使用情况。它真正要做的是显示如果只有一个进程在运行,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误的。
(注:这里详细介绍了这个问题。)
当前回答
尝试pmap命令:
sudo pmap -x <process pid>
其他回答
在最新版本的Linux中,使用smaps子系统。例如,对于PID为1234的进程:
cat /proc/1234/smaps
它会确切地告诉你当时它使用了多少内存。更重要的是,它将把内存分为私有和共享,这样你就可以知道你的程序实例使用了多少内存,而不包括程序的多个实例之间共享的内存。
去找Valgrind。让它运行你的程序,它会告诉你它的内存使用情况。
这只适用于程序运行一段时间并停止的情况。我不知道Valgrind是否能够控制一个已经运行的进程,或者不应该停止的进程,比如守护进程。
这是对工具和问题的极好总结:archive.org链接
我会引用它,这样更多的开发者会真正阅读它。
如果要分析整个系统的内存使用情况,或者要彻底分析一个应用程序的内存使用(而不仅仅是其堆使用情况),请使用exmap。对于整个系统分析,找到具有最高有效使用率的进程,它们实际上占用了最多的内存,找到具有最大可写使用率的过程,它们创建了最多的数据(因此可能泄漏或数据使用效率很低)。选择这样的应用程序并在第二个列表视图中分析其映射。有关详细信息,请参见exmap部分。还可以使用外部停止检查X资源的高使用率,特别是在X服务器的进程占用大量内存的情况下。有关详细信息,请参见外部停止部分。如果要检测泄漏,请使用valgrind或kmtrace。如果您想分析应用程序的堆(malloc等)使用情况,可以在memprof或kmtrace中运行它,分析应用程序并在函数调用树中搜索最大的分配。有关更多详细信息,请参见其章节。
我正在使用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
=============================================
还有三种方法可以尝试:
ps aux—排序设备它按%MEM对输出进行排序。ps aux | awk“{打印$2,$4,$11}”|排序-k2r |头-n 15它使用管道进行排序。顶部-a它开始按%MEM排序
(摘自此处)