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

其他回答

我正在使用htop;这是一个非常好的控制台程序,类似于Windows任务管理器。

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

ps_mem.pyGitHub上的ps_mem.py

还有三种方法可以尝试:

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

(摘自此处)

使用时间。

不是Bash内置时间,而是您可以找到的时间,例如/usr/bin/time。

下面是它的内容,在一个简单的ls上:

$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

使用smem,它是ps的替代方案,ps计算每个进程的USS和PSS。你可能想要PSS。

USS-独特的集合大小。这是该进程独有的非共享内存量(将其视为U表示唯一内存)。它不包括共享内存。因此,这将低估进程使用的内存量,但当您想忽略共享内存时,这很有用。PSS-比例设置大小。这就是你想要的。它将唯一内存(USS)与共享内存的比例除以共享该内存的进程数相加。因此,它将为您提供每个进程实际使用多少物理内存的准确表示——共享内存真正表示为共享内存。想象一下P代表物理内存。

这与ps和其他实用程序报告的RSS相比如何:

RSS-常驻集大小。这是每个进程使用的共享内存加上非共享内存的数量。如果任何进程共享内存,这将超额报告实际使用的内存量,因为相同的共享内存将被计数多次-再次出现在共享相同内存的其他进程中。因此,它相当不可靠,特别是当高内存进程有很多分叉时——这在服务器中很常见,比如Apache或PHP(FastCGI/FPM)进程。

注意:smem还可以(可选)输出饼图等图形。你不需要这些。如果您只想从命令行使用它,就像您可能使用ps-Av一样,那么您不需要安装Python和Matplotlib推荐的依赖项。