Linux进程内存—— VSS、RSS、PSS、USS及查看方式

1. 概念

  1. VSS Virtual Set Size 虚拟耗用内存
    进程可访问的全部内存地址空间大小,这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。

此大小还包括可能不驻留在RAM中的内存,如已分配但未写入的malloc。 VSS对于确定进程的实际内存使用非常少用

  1. RSS Risident Set Size 实际使用物理内存(包含共享库占用的内存)

表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。

RSS可能会产生误导,因为它报告进程使用的所有共享库的总数,即使共享库只加载到内存中一次,无论有多少进程使用它。 RSS不是单个进程的内存使用的准确表示

  1. PSS Proportional Set Size 实际使用的物理内存,(比例分配共享库占用的内存)
    表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样

PSS可能有点误导,因为当进程被杀死时,PSS不能准确地表示返回到整个系统的内存

  1. USS 进程独自占用的物理内存(不包含共享库占用的内存)

表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!

USS是一个非常有用的数字,因为它表示运行特定进程的真正增量成本。当进程被终止时,USS是实际返回到系统的总内存。 USS是判断进程中的内存泄漏时最值得注意的数字。

3 查看

3.1 ps

ps命令可以获取进程的VSS、RSS、内存使用率,其中:

  1. VSZ列表示的VSS,单位是KB;
  2. RSS列的单位是KB;
  3. %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

  1. VIRT列表示的是VSS,单位是KB;
  2. 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

3.3smem命令

smem命令可以获取进程的RSS、PSS、USS,单位是KB。

[root@node-2 ~]# smem
  PID User     Command                         Swap      USS      PSS      RSS
31940 postgres postgres: logger                 876      100      126     1260

3.4 pmap命令

pmap命令可以获取进程的VSS,RSS,其中:

  1. Kbytes列表示的VSS,单位是KB;
  2. Kbytes列表示的VSS,单位是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

3.5 查看进程状态文件

通过查看进程的状态文件,可以获取进程的VSS、RSS,其中:

  1. VmSize表示的是VSS;
  2. 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值