什么是 VSZ 与 RSS
ps 输出里有两个常被误用的内存列:VSZ 是进程虚拟地址空间大小,包含了大量已经预留但从未真正使用的地址(典型如 JVM 的预留空间),它偏大通常不代表占用高;RSS 是当前驻留在物理内存中的页数,包含与其他进程共享的库与共享内存,因此把多个进程的 RSS 相加会大于实际物理占用。要评估“这个进程真实吃了多少内存”,需要用 PSS 口径。
基本信息
| 列名 | vsz(虚拟)/ rss(常驻)/ pmem(占物理内存百分比) |
|---|---|
| 排序 | ps --sort=-rss 按 RSS 从大到小 |
| 口径差异 | 共享库与共享内存被重复统计 |
| 更准口径 | PSS(smaps_rollup 或 smem)按共享比例分摊 |
| 配套工具 | pidstat -r 观察内存随时间变化 |
| 注意 | RSS 单位在 ps 中通常为 KiB |
典型使用场景
- 找出内存占用最高的进程:按 RSS 排序的日常入口
- 解释“RSS 之和超过物理内存”:共享内存的重复计数
- 评估真实占用:用 PSS 替代 RSS 做总量核算
- 观察内存增长趋势:pidstat 间隔采样而非单次快照
- 容器内核对:与 cgroup 的 memory.current 交叉验证
常用命令
常用命令
ps -eo pid,vsz,rss,pmem,comm --sort=-rss | head # 按 RSS 排序
ps -eo pid,rss,comm | awk '{s+=$2} END {print s" KiB"}' # 求和(含重复计数)
pidstat -r -p 12345 1 5 # 内存随时间变化
cat /proc/12345/smaps_rollup | grep -i -E 'Rss|Pss' # PSS 口径
cat /proc/12345/status | grep -i -E 'VmRSS|VmHWM' # 峰值 RSS
cat /proc/12345/statm # 页数视角的快速查看内存口径对照
| 口径 | 统计范围 | 适用 |
|---|---|---|
| VSZ | 虚拟地址空间 | 判断预留规模,不代表占用 |
| RSS | 常驻物理页(含共享) | 快速排序找大户 |
| PSS | 共享页按比例分摊 | 评估真实物理占用 |
| USS | 独占部分 | 判断进程自身增量 |
| VmHWM | 历史峰值 RSS | 排查瞬时高峰 |
把 RSS 相加去做容量规划会系统性高估:同一份共享库被几十个进程引用时会被重复计算,用 PSS 汇总更接近真实值。
容器内 ps 显示的是宿主命名空间下的视图(取决于运行时配置),与 cgroup 限制不是同一口径,判断容器是否接近限制要用 cgroup 文件。
排查内存增长时把历史峰值(VmHWM)与当前 RSS 一起看:峰值明显高于当前值说明曾出现瞬时高峰,间隔较长的常规采样很容易漏掉这类现象。