rss代表进程当前实际驻留在物理内存中的字节数,不含swap和未访问的mmap页;vsz代表进程整个虚拟地址空间大小,包括已分配未用内存、共享库、映射文件等,可能远超物理内存。

ps aux 输出里的 RSS 和 VSZ 分别代表什么
查进程内存分布,第一眼就该盯住 ps aux 的 RSS 和 VSZ 列。它们不是“总内存占用”的简单相加,而是两个不同维度的度量:
-
RSS(Resident Set Size):当前实际驻留在物理内存中的字节数,不含 swap,也不含 mmap 但未访问的页 —— 这是你真正“吃掉”的物理内存 -
VSZ(Virtual Size):进程整个虚拟地址空间大小,包括已分配但未使用的内存、mmap 映射的文件、共享库、以及所有尚未换入物理内存的页 —— 它可能远大于物理内存,甚至超过系统总内存
比如一个 Java 进程 VSZ 显示 4g,RSS 只有 1.2g,说明它申请了大量虚拟内存(如堆上限设为 4g),但当前只用了 1.2g 物理内存。别误以为它占了 4g RAM。
pmap -x pid 能看到哪些关键内存段
要深入看进程内部怎么分内存,pmap -x <pid></pid> 是最直接的命令。它按内存映射区域列出每一块的 Kbytes、RSS(实际驻留)、Dirty(脏页)和权限模式:
- 重点关注
RSS列总和,它应与ps aux的RSS基本一致(允许少量误差) - 带
[ anon ]标签的是堆、栈、mmap 分配的匿名内存;[ heap ]和[ stack ]是明确标识的区域 - 大块连续的
[ anon ]区域(如几十 MB 或上百 MB)往往对应 JVM 堆、Python 的对象池、或 C 程序 malloc 的大块内存 - 如果某块
Dirty高但RSS低,说明它刚被写入但还没被内核调度进物理页 —— 这类区域在压力下会快速拉升 RSS
示例中 pmap -x 18512 显示多个 10MB 级别的 [ anon ] 段,正是 mongod 内部缓存和连接缓冲区的典型分布。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
top -p pid 里 %MEM 和 RES 的关系
top -p <pid></pid> 实时刷新单个进程,它的 %MEM 是 RES(即 RSS)占系统总物理内存的百分比,不是占可用内存的百分比:
-
RES和ps aux的RSS是同一指标,单位 KB -
%MEM计算公式是:RES / (total physical memory in KB) * 100—— 所以即使系统还有 2GB free,只要总内存是 8GB,一个占 1GB RSS 的进程就显示%MEM = 12.5 - 注意:top 默认不显示
SWAP列,无法直接看出该进程有多少页被换出;需按f进入字段管理,手动启用SWAP才能看到
这个百分比容易误导人判断“是否异常”,尤其在高内存机器上 —— 一个 2% MEM 的进程,背后可能是 16GB RSS(总内存 800GB),必须结合绝对值看。
为什么 cat /proc//smaps 更细但难读
/proc/<pid>/smaps</pid> 是内核暴露的最全内存视图,包含 Pss(按比例分摊的共享内存)、MMUPageSize、MMUPageCount、各类型页计数等,但它不适合日常排查:
- 输出长达数百行,没有汇总;想看总 RSS 得用
awk '/^Rss:/ {sum += $2} END {print sum}' /proc/<pid>/smaps</pid> -
Pss对多进程共享库(如 libc)更公平,但调试单个进程内存泄漏时意义不大 - 某些字段(如
KernelPageSize)只在启用大页(hugepage)时才有值,普通场景为空,徒增干扰 - 相比
pmap -x,它不按地址排序,无法直观看出哪块映射占得多
除非你在分析共享内存竞争、THP 影响或需要精确到 page fault 类型,否则优先用 pmap -x 和 ps aux 组合,够用且不易错读。










