发布于2026-05-21 阅读(0)
扫一扫,手机访问
VSZ是进程申请的虚拟内存总量(含未映射部分),RSS是其当前驻留物理内存的实际大小;VSZ≠真实内存占用,RSS才反映实际RAM消耗且为OOM Killer判定依据。

排查服务器内存问题时,很多人习惯性地打开终端,敲下 ps aux,然后盯着那列数字最大的进程下结论。但这里有个常见的认知陷阱:VSZ 和 RSS 这两个指标,含义天差地别。如果直接拿 VSZ 的大小来判断哪个进程“吃内存”,很可能会闹出误会。
简单来说,VSZ(Virtual Memory Size)代表进程申请的“虚拟地盘”总量,单位是KB。这块地盘画得很大,但里面不一定都住了“人”。它包括了已经通过 malloc 申请但尚未写入数据的堆内存、通过 mmap 映射的文件或共享库、甚至是为未来预留但完全没被访问过的地址区间。这些都不消耗实际的物理内存,仅仅是进程在地址空间里“画了个圈”。
而 RSS(Resident Set Size)才是当前真正住在物理内存(RAM)里的“居民”。比如已经写入数据的堆页、正在执行的代码页、栈上的活跃数据等。只有这部分才会挤占宝贵的物理内存资源。
一个典型的误解是认为 VSZ 数值大就等于内存压力大。其实不然。举个例子,一个刚启动的Ja va进程,VSZ 可能轻松超过2GB,但它的 RSS 也许只有100MB左右。再比如一个C程序,只进行大量 malloc 分配而不进行实际写入(memset),它的 VSZ 可以飙到500MB,但 RSS 可能只有寥寥几MB。
最直接有效的方法,就是让 ps 命令按 RSS 降序排列,一眼找出“大户”:
ps aux --sort -rss | head -n 10
使用这个命令时,有几点需要注意:
--sort -rss 里的负号“-”代表降序,如果漏了,结果就会变成升序排列,容易看错。ps 默认显示的 RSS 单位是KB,单纯看数字大小可能不够直观。更好的方法是结合系统总内存来看比例,这时 %MEM 列(内存使用百分比)往往更有参考价值。RSS 高是合理的,比如数据库利用内存做缓存、视频转码进程需要大量内存处理帧数据。不能一概而论地认为高 RSS 就是异常。根本原因在于,当系统物理内存不足时,内核的“清道夫”——OOM Killer——出手的依据正是 RSS,而非 VSZ。系统真正危险的时刻,是当所有进程的 RSS 总和接近 /proc/meminfo 中 MemTotal 值的时候。而 VSZ 的总和超过物理内存数倍是Linux虚拟内存机制的常态,这本身并不构成威胁。
另外还有一个细节:RSS 包含了共享库占用的物理页。这意味着,当多个进程都使用同一个glibc库时,这部分共享内存会被重复计入每个进程的 RSS 中,导致统计的总 RSS 大于实际物理占用。如果想更精确地评估单个进程独占的内存,应该关注 USS(Unique Set Size)。可以使用 smem 工具来查看:
smem -p -c "pid uss rss pss cmdline" | head -n 10
RSS 是“驻留集”,但它不区分内存页是独占还是共享。举个例子,两个独立的Python进程都导入了numpy库,那么底层共享的NumPy .so库文件所占用的物理内存页,会被同时算进这两个进程的 RSS 里。这就导致了:
ps aux 查看单个进程时,其 RSS 值比它实际独占的内存要大,这是正常现象。free 命令查看系统整体内存情况时,只有当 used 内存接近 MemTotal 时,才说明物理内存真的紧张了。RSS 是否随时间呈线性增长趋势,而不是依赖某一次的快照值。真正考验判断力的,是那些 RSS 缓慢上升、偶尔又下降的进程。这可能是内存泄漏的迹象,也可能是应用程序自身合理的缓存策略在运作。遇到这种情况,就不能只相信 ps 的一行数字了,需要借助更细致的工具,比如查看 /proc/ 文件,或者使用 pmap -x 命令来分析进程具体的内存段分布,从而做出准确诊断。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9