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

使用“ps”工具查看VSZ使用量

VSZ 是 Virtual Set Size,进程的总虚拟内存大小,即交换和 内存 中的内存总量。

手册页说明

vsz        VSZ      virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).

进程的虚拟内存大小,单位为KiB(1024字节单位)。设备映射目前被排除在外;这可能会发生变化(别名vsize)。

示例:

# ps aux | sed -e '1p' -e '/amsHelper/!d' | grep -v sed
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2071  0.0  0.0 176508 11620 ?        Ss   Jul31   0:27 /sbin/amsHelper -f

VSZ 大小约为 172MB

重要说明:在 linux 中运行的大多数程序都使用共享库。
请注意,VSZ 和 RSS 将与进程一起显示共享库使用的内存。
由于一个进程使用的共享库可以被另一个进程使用而不会重复,这将导致内存占用过多。

使用“ps”工具查看RSS的使用情况

ps 显示有关所选活动进程的信息。
默认情况下,当执行 ps 时,我们会得到以下列列表

# ps aux | head -n 1
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

这里的RSS是Resident Set Size,进程使用的非交换物理内存。

手册页说明:

rss        RSS      resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).

常驻集大小,任务已使用的非交换物理内存(以KB为单位)(别名rssize,rsz)。

重要说明:RSS 字段不计算进程的某些部分,包括页表、内核堆栈、struct thread_info 和 struct task_struct。
这通常是至少 20 KiB 的始终常驻内存。

示例:

# ps aux | sed -e '1p' -e '/amsHelper/!d' | grep -v sed
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2071  0.0  0.0 176508 11620 ?        Ss   Jul31   0:27 /sbin/amsHelper -f

根据 RSS,amsHelper 正在使用 ~11MB

Linux如何查看进程的线程数?

我们可以使用以下命令检查每个进程的活动线程数

#  cat /proc/$(pgrep amsHelper)/status | grep -i Threads
Threads:        1
#  cat /proc/$(pgrep java)/status | grep -i Threads
Threads:        2527

如我们所见,我的“amsHelper”进程正在单线程上运行,而“java”进程正在运行 2527 个线程

我的 amsHelper 进程的 VmData 大小是 ~6MB

# grep -i vmdata /proc/$(pgrep amsHelper)/status
VmData:     6964 kB

使用 pmap 查看每个进程的内存使用情况

要获得进程消耗的内存的更精确计数,请使用 pmap 命令。
“pmap”是另一种工具,它分别报告每个进程或者多个进程的内存使用情况,这将有助于跟踪进程使用的确切内存。

使用“-X”我们可以获得更详细的输出

# pmap -X $(pgrep amsHelper)
2071:   /sbin/amsHelper -f
Address Perm   Offset Device  Inode   Size   Rss   Pss Referenced Anonymous Swap Locked Mapping
00400000 r-xp 00000000  fd:00  13936   1632  1032  1032       1032         0    0      0 amsHelper
00798000 r--p 00198000  fd:00  13936      4     4     4          4         4    0      0 amsHelper
00799000 rw-p 00199000  fd:00  13936     52    44    44         44        16    0      0 amsHelper
7eff2ac7a000 r--s 00000000  fd:00 276277    264   264   264        264         0    0      0 modules.dep
7eff2acbd000 rw-p 00000000  00:00      0     56    56    56         56        56    0      0
7eff2accb000 r--s 00000000  fd:00 132676     28    24     2         24         0    0      0 gconv-modules.cache
7eff2acd3000 r--p 00021000  fd:00   3107      4     4     4          4         4    0      0 ld-2.17.so
7eff2acd4000 rw-p 00022000  fd:00   3107      4     4     4          4         4    0      0 ld-2.17.so
7eff2acd5000 rw-p 00000000  00:00      0      4     4     4          4         4    0      0
7ffeccb5d000 rw-p 00000000  00:00      0    132    32    32         32        32    0      0 [stack]
7ffeccb7e000 r-xp 00000000  00:00      0      8     4     0          4         0    0      0 [vdso]
ffffffffff600000 r-xp 00000000  00:00      0      4     0     0          0         0    0      0 [vsyscall]
====== ===== ===== ========== ========= ==== ======
176512 11620 10026      11620      6912    0      0 KB

这里所有没有权限的映射都是缓冲区段,具有只读权限的映射将使用地址空间而不是实际内存,因此在计划计算进程/应用程序的内存使用情况时可以忽略

下面是一个小的正则表达式,可用于通过排除所有缓冲区段来计算“amsHelper”进程的资源内存

#  pmap -X $(pgrep amsHelper) | egrep -v "---p" |egrep -v "r--p" | awk '{Total+=} END {print Total/1024" MB"}'
11.3477 MB

对于我的 Java 进程

# pmap -X $(pgrep java) | egrep -v "---p" | tail -n 1 | awk -F " " '{print /1024" MB"}'
345.441 MB

查看内存利用率统计信息的简短摘要。

# free

查看虚拟内存统计信息。

# vmstat

查看内存使用统计的详细信息。

# cat /proc/meminfo

重复查看报告内存和交换空间利用率统计信息(示例的采样为 5 秒,计数为 10)

# sar -r 5 10

没有简单或者非常可靠的方法来识别单个进程或者程序或者应用程序使用的实际内存量,因为每个进程都将使用来自各种库(如 glibc)的多个系统映射,这些库也将被许多其他进程使用,因此报告的内存将包括这些其他缓冲区段使用的内存。

虽然我们可以通过使用以下方法来足够接近实际的内存利用率。
但是仍然有几种方法可以用来为我们提供一些与内存相关的数据,可以满足要求。

重复查看虚拟内存统计信息(示例的采样为 5 秒。

# vmstat 5

来自进程状态的 VmData 使用情况

VmData 计算为减去共享和堆栈页面的总地址空间使用量(即 VmSize)。

重要说明:当我们检查的进程是多线程时,这可能会误导很多次。

对于单线程进程,这可以提供更多有用的信息。

查看slab利用率统计的详细信息。

# cat /proc/slabinfo
日期:2020-06-02 22:16:48 来源:oir作者:oir