Yu Guo @ yuguo.im

进程内存的四层指标:VSS / RSS / PSS / USS

Aug 14 · 5min

由外到内层层收窄 —— 从「申请了多少虚拟地址」到「杀掉进程能立刻释放多少物理内存」。越往里,越接近真实、越私有。

包含关系一览

外层完全包住内层:VSS ≥ RSS ≥ PSS ≥ USS。四个盒子测的是同一块内存的不同「口径」。

VSSVirtual Set Size · 虚拟耗用内存最虚 · 最不可信

进程申请的全部虚拟地址空间:含未映射物理页的区域、已换出(Swap)的页、共享库的完整大小。数字大,但不代表真实占用。

RSSResident Set Size · 常驻物理内存会重复计算

真正装进物理内存的部分 = 独占物理内存 + 共享库的完整物理内存。多个进程共享同一个库时,每个进程都完整计一遍

PSSProportional Set Size · 比例物理内存最能反映真实贡献

独占物理内存 + 按共享进程数平摊的共享物理内存。所有进程的 PSS 相加 ≈ 系统实际用量,最适合评估单进程的真实贡献。

USSUnique Set Size · 独占物理内存杀掉即释放

仅进程自身私有、不与任何人共享的物理内存。杀掉该进程,系统能立即回收的量就是它。

数字更大 / 更虚更真实 / 更私有

四个指标怎么选

同样一块内存,看你想回答哪个问题。

指标包含什么回答的问题致命局限
VSS已申请的虚拟内存全部(含未分配、已 Swap、共享库全量)进程「画了多大的饼」与真实物理消耗几乎无关,参考价值低
RSS独占物理内存 + 共享库完整物理内存进程占了多少物理内存重复计算:各进程 RSS 相加会远超物理内存总量
PSS独占物理内存 + 共享部分按进程数平摊进程对系统的真实物理贡献需要按共享关系计算,采集成本略高
USS私有、不共享的物理内存杀掉进程能立即释放多少忽略共享成本,不代表进程完整「体量」

一个例子,四个数就分开了

进程 A:私有 20 MB,并与另外 2 个进程共用一个 12 MB 的库(共 3 个进程共享),此外还申请了但尚未真正使用物理页的虚拟空间。

进程 A 的内存构成

私有物理内存:20 MB(只属于 A)
共享库物理内存:12 MB(A、B、C 三家共用)
已申请未映射 / 已 Swap 的虚拟空间

关键算式

USS = 20私有部分
PSS = 20 + 12 ÷ 3 = 24平摊共享
RSS = 20 + 12 = 32完整计共享
VSS = 32 + 虚拟空间 > 32
USS
20MB
独占
PSS
24MB
平摊 12÷3
RSS
32MB
全量共享
VSS
>32MB
含虚拟

为什么 PSS 最公道

那 12 MB 的库只在物理内存里存了一份。把三个进程的账单加起来对比就很清楚:

口径进程 A进程 B进程 C合计与真实占用(12 MB)的偏差
RSS 记法12 MB12 MB12 MB36 MB凭空多算 24 MB
PSS 记法4 MB4 MB4 MB12 MB完全吻合

Tip

RSS 让 A、B、C 每家都记 12 MB,三家相加 = 36 MB,凭空多算出 24 MB;PSS 让每家只记 4 MB,三家相加正好 = 12 MB,与真实占用吻合。

怎么记

USS ≤ PSS ≤ RSS ≤ VSS

  • 排查内存泄漏:看 USS / PSS 的增长趋势。
  • 评估系统总压力:把各进程的 PSS 相加。
> comment on bluesky / twitter
>
CC BY-NC-SA 4.0 2021-PRESENT © Yu Guo