如何在Linux中检查每个进程的内存使用情况

时间:2020-01-09 10:37:39  来源:igfitidea点击:

Linux检查每个进程的内存使用情况。如何检查哪个进程在Linux中使用了更多的内存。 Linux一个进程使用多少内存。 Linux跟踪一段时间内进程内存的使用情况。 linux检查每个进程的内存使用率(以mb为单位)。

Linux检查内存。 linux显示内存使用情况。 linux查看内存使用情况。 linux内存使用信息。 linux进程内存使用情况。如何在Linux中检查内存使用情况。

在Linux中,有几种指标可用于检查"每个进程的内存使用情况"。我将从最容易获得的两个开始

  • 虚拟集大小(vss)

  • 常驻内存大小(rss)

两者在ps和top命令的大多数实现中都可用。

  • " Vss":在" ps"命令中称为" VSZ",在" top"中称为VIRT,是一个进程映射的内存总量。它是/proc/<PID>/map中显示的所有区域的总和。由于只有一部分虚拟内存在任何时候都被提交给物理内存,因此这个数字的用途很有限。

  • " Rss":在" ps"中称为" RSS",在" top"中称为" RES",是映射到内存物理页的内存总和。这接近于进程的实际内存预算,但是存在一个问题,如果将所有进程的" Rss"加起来,我们将高估正在使用的内存,因为某些页面将被共享。

使用top和ps检查每个进程(VSS和RSS)的内存使用情况

ps命令显示带有选项-Aly的自定义格式Vss(VSZ)和Rss(RSS),以及包含vszrss的自定义格式,如下所示

# ps -eo pid,tid,class,rtprio,stat,vsz,rss,comm
  PID   TID CLS RTPRIO STAT    VSZ   RSS COMMAND
 1283  1283 TS       - S<sl  59636  1116 auditd
 1337  1337 TS       - Ssl  476848  9996 NetworkManager
 1366  1366 TS       - Ssl  553488 13196 polkitd
 1456  1456 TS       - S    267684 31768 sssd_nss
 1617  1617 TS       - Ss+  116376   872 agetty
 2955  2955 TS       - Ss    93728  2236 master
 4843  4843 TS       - Ss   156356  5156 sshd

同样," free"和" top"还显示了每个进程的可用内存和内存使用情况的摘要:

# free -m
              total        used        free      shared  buff/cache   available
Mem:         128814        7603       52253         153       68957      120163
Swap:          4091           0        4091

说明:

这些简单的命令使我们可以感觉到内存的使用情况,并在看到进程的Rss持续增加时首先表明存在内存泄漏。但是,它们在内存使用率的绝对测量中不是很准确。

使用smem检查每个进程的内存使用情况

2009年,Matt Mackall开始研究在进程内存测量中考虑共享页面的问题,并添加了两个新的度量标准,称为"唯一集大小"或者" Uss",以及"比例集大小"或者" Pss"。

  • " Uss":这是提交给物理内存的内存量,对于进程是唯一的;它不会与其他任何人共享。它是如果进程终止将释放的内存量。

  • Pss:这将分配给物理内存的共享页面的记帐分配在所有映射它们的进程之间。例如,如果一个库代码区域长12页,并由六个进程共享,则每个进程将在Pss中累积两页。因此,如果为所有进程添加" Pss"编号,则将获得这些进程正在使用的实际内存量。换句话说," Pss"是我们一直在寻找的号码。

另请阅读:

Shell脚本可检查Linux中的顶级内存和cpu消耗过程

该信息在/proc/&lt;PID>/smaps中可用,其中包含在`/proc/<PID>/maps中显示的每个映射的添加信息。这是该文件的一部分,其中提供了有关libc代码段的映射的信息:

# cat /proc/31768/smaps | grep -i pss
Pss:                1132 kB
Pss:                   4 kB
Pss:                  44 kB
Pss:                  48 kB
Pss:               54632 kB
Pss:                   1 kB
<< Output trimmed >>
Pss:                   0 kB
Pss:                   0 kB
Pss:                   4 kB
Pss:                   4 kB
Pss:                   4 kB
Pss:                   0 kB
# cat /proc/31768/smaps | grep -i pss |  awk '{Total+=} END {print Total/1024" MB"}'
56.4102 MB
# cat /proc/31768/smaps | grep -i rss |  awk '{Total+=} END {print Total/1024" MB"}'
58.7109 MB

说明:

注意," Rss"是" 58.7 M",但是由于它在许多其他进程之间共享,因此" Pss"只有56.4 MB。

有一个名为" smem"的工具,它可以对来自smaps文件的信息进行整理,并以各种方式(包括饼图或者条形图)进行显示。 " smem"的项目页面为https://www.selenic.com/smem。

可以将各种过滤器应用于" smem",如下所示,其中包含最新的可用发行版(1.4)。

# ./smem --help
Usage: smem [options]
Options:
  -h, --help            show this help message and exit
  -H, --no-header       disable header line
  -c COLUMNS, --columns=COLUMNS
                        columns to show
  -t, --totals          show totals
  -R REALMEM, --realmem=REALMEM
                        amount of physical RAM
  -K KERNEL, --kernel=KERNEL
                        path to kernel image
  -m, --mappings        show mappings
  -u, --users           show users
  -w, --system          show whole system
  -P PROCESSFILTER, --processfilter=PROCESSFILTER
                        process filter regex
  -M MAPFILTER, --mapfilter=MAPFILTER
                        map filter regex
  -U USERFILTER, --userfilter=USERFILTER
                        user filter regex
  -n, --numeric         numeric output
  -s SORT, --sort=SORT  field to sort on
  -r, --reverse         reverse sort
  -p, --percent         show percentage
  -k, --abbreviate      show unit suffixes
  --pie=PIE             show pie graph
  --bar=BAR             show bar graph
  -S SOURCE, --source=SOURCE
                        /proc data source

要检查每个进程的内存使用总量,我们可以执行以下命令

# ./smem -t -k
  PID User     Command                         Swap      USS      PSS      RSS
 5496 ssrun    ssRelay -pidfile /opt/mgtse        0   112.0K   152.0K   460.0K
 5522 ssrun    ssProbeframework -pidfile/      0   116.0K   156.0K   464.0K
 2072 root     rhnsd                              0   172.0K   194.0K   616.0K
 2013 root     /usr/bin/rhsmcertd                 0   172.0K   195.0K   684.0K
 1617 root     /sbin/agetty --noclear tty1        0   184.0K   196.0K   876.0K
 1493 root     /usr/sbin/atd -f                   0   260.0K   271.0K     1.1M
22058 root     /usr/sbin/rpc.idmapd               0   380.0K   384.0K   676.0K
 7802 root     /usr/sbin/xinetd -stayalive        0   396.0K   408.0K     1.1M
<< Output trimmed >> 
 
10901 rpc      /sbin/rpcbind -w                   0   608.0K   655.0K     1.4M
11885 oamsys   -bash                              0   524.0K   739.0K     2.2M
 4847 oamsys   -bash                              0   528.0K   743.0K     2.2M
 2008 root     /usr/sbin/oddjobd -n -p /va        0   632.0K   764.0K     1.9M
22202 sufuser  /usr/sbin/httpd -DFOREGROUN        0   372.0K   768.0K     5.4M
22203 sufuser  /usr/sbin/httpd -DFOREGROUN        0   372.0K   768.0K     5.4M
27326 sufuser  /usr/sbin/httpd -DFOREGROUN        0   372.0K   768.0K     5.4M
22199 sufuser  /usr/sbin/httpd -DFOREGROUN        0   372.0K   769.0K     5.4M
27327 sufuser  /usr/sbin/httpd -DFOREGROUN        0   372.0K   769.0K     5.4M
22201 sufuser  /usr/sbin/httpd -DFOREGROUN        0   380.0K   775.0K     5.4M
22200 sufuser  /usr/sbin/httpd -DFOREGROUN        0   380.0K   776.0K     5.4M
12096 root     -bash                              0   580.0K   809.0K     2.3M
 7989 ntp      /usr/sbin/ntpd -u ntp:ntp -        0   780.0K   814.0K     1.7M
11564 oamsys   /usr/libexec/openssh/sftp-s        0   744.0K   834.0K     2.4M
 5523 ssrun    ssProbeframework -pidfile/      0   185.3M   191.3M   198.4M
------------------------------------------------------------------------------
   93 11                                          0     1.9G     2.0G     2.1G

这将为我们提供系统上活动的每个进程的内存使用情况详细信息。

为了获得单个进程的内存使用情况,我们可以从列表中grep进程

# ./smem -k | sed -e '1p' -e '/amsHelper/!d' | grep -v sed
  PID User     Command                         Swap      USS      PSS      RSS
31768 root     /sbin/amsHelper -f                 0    56.0M    56.4M    58.7M

如我们所见,使用/proc/31768/smapssmem工具,我们得到与上面类似的结果。因此,amsHelper的实际内存使用量为56.4 MB。