VSS
虚拟耗用内存大小,是进程可以访问的所有虚拟内存的总量,包括进程独自占用的物理内存、和其他进程共享的内存、分配但未使用的内存。
RSS
驻留内存大小,是进程当前实际占用的物理内存大小,包括进程独自占用的物理内存、和其他进程共享的内存。
PSS
比例驻留内存大小,包括进程独自占用的物理内存、比例分配和其他进程共享的内存(共享库内存会均分到各个共享进程)。
USS
独立内存大小,表示进程独自占用、不与其他进程共享的物理内存。
图解
Linux进程内存查看方式
ps命令
ps命令可以获取进程的VSS、RSS、内存使用率,其中:
- VSZ列表示的VSS,单位是KB;
- RSS列的单位是KB;
- %MEM列表示的是内存使用率,是进程RSS与系统总物理内存的比值;
[root@localhost ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 128620 4484 ? Ss 2022 228:42 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 2022 1:47 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2022 20:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 2022 0:00 [kworker/0:0H]
......
postgres 31940 0.0 0.0 251780 1256 ? Ss May19 1:31 postgres: logger
top命令
top命令可以获取进程的VSS、RSS,其中:
- VIRT列表示的是VSS,单位是KB;
- RES列表示的是RSS,单位是KB;
[root@localhost ~]# top
top - 20:48:34 up 561 days, 9:34, 2 users, load average: 0.40, 0.80, 1.18
Tasks: 302 total, 1 running, 301 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6.1 us, 0.8 sy, 0.0 ni, 92.8 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 16425244 total, 560044 free, 12011580 used, 3853620 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1632372 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 492728 4540 1548 S 0.0 0.0 133:41.72 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:11.53 kthreadd
31940 postgres 20 0 251780 1256 712 S 0.0 0.0 1:31.24 postmaster
smem命令
smem命令可以获取进程的RSS、PSS、USS,单位是KB。
[root@node-2 ~]# smem
PID User Command Swap USS PSS RSS
31940 postgres postgres: logger 876 100 126 1260
pmap命令
pmap命令可以获取进程的VSS,RSS,其中:
- Kbytes列表示的VSS,单位是KB;
- RSS列的单位是KB;
[root@node-2 ~]# pmap -x 31940
31940: postgres: logger
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 7392 216 0 r-x-- postgres
0000000000d37000 4 4 4 r---- postgres
......
---------------- ------- ------- -------
total kB 251784 1260 548
查看进程状态文件
通过查看进程的状态文件,可以获取进程的VSS、RSS,其中:
- VmSize表示的是VSS;
- VmRSS表示的是RSS;
[root@node-2 ~]# cat /proc/31940/status
Name: postmaster
Umask: 0077
State: S (sleeping)
Tgid: 31940
Ngid: 0
Pid: 31940
PPid: 31938
TracerPid: 0
Uid: 26 26 26 26
Gid: 26 26 26 26
FDSize: 64
Groups: 26
VmPeak: 454540 kB
VmSize: 251780 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 2132 kB
VmRSS: 1256 kB
RssAnon: 544 kB
RssFile: 712 kB
RssShmem: 0 kB
VmData: 1040 kB
VmStk: 132 kB
VmExe: 7392 kB
VmLib: 38308 kB
VmPTE: 236 kB
VmSwap: 876 kB
Threads: 1
SigQ: 0/64052
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001307806
SigCgt: 00000001a0000201
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Speculation_Store_Bypass: vulnerable
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 1320418
nonvoluntary_ctxt_switches: 70
通过查看进程的smaps文件,可以获取进程每个内存映射块的详细信息,求和可以得到进程的RSS、PSS、USS,其中:
- Private_Clean和Private_Dirty表示进程的私有、不可共享的已清洁(Clean)和已脏(Dirty)内存大小,将这两个值相加即可得到USS。
[root@node-2 ~]# cat /proc/31940/smaps | grep 'Rss' | awk '{Total+=$2} END {print Total"KB"}'
1260KB
[root@node-2 ~]# cat /proc/31940/smaps | grep 'Pss' | awk '{Total+=$2} END {print Total"KB"}'
126KB
[root@node-2 ~]# cat /proc/31940/smaps | grep 'Private' | awk '{Total+=$2} END {print Total"KB"}'
100KB
参考
Process Memory Management in Linux | Baeldung on Linux