Linux进程RSS内存是否含缓存?如何获取进程实际占用内存?
Linux进程RSS与缓存内存的疑问解答
1. RSS内存是否包含缓存内存?
答案是肯定的。RSS(Resident Set Size)指的是进程当前实际驻留在物理内存中的字节数,它的组成里不仅有进程自身的私有代码、数据、栈内存,还包含了进程读取文件时被内核缓存到物理内存中的页——比如你进程读取了一个配置文件,内核会把这个文件的内容缓存起来,只要这些缓存页还没被内核回收,就会被算进该进程的RSS值里。
简单说:只要是进程关联的、当前在物理内存中的缓存页,都会被RSS统计进去。
2. 如何获取排除缓存后的进程实际内存?
想要排除共享缓存后的内存,得看你需要的是「完全独占的内存」还是「按比例分摊的共享内存」,这里给你几个实用的方法:
方法一:通过/proc/[pid]/smaps手动计算
每个进程的/proc/[pid]/smaps文件会详细拆分内存段的类型,我们可以提取私有内存部分,这部分就是排除了共享缓存的内存:
# 替换[pid]为你要查看的进程ID grep -E 'Private_Dirty|Private_Clean' /proc/[pid]/smaps | awk '{sum += $2} END {print sum " KB"}'
Private_Dirty:进程修改过的私有内存页Private_Clean:进程未修改过的私有内存页
两者相加就是进程完全独占的内存,不包含任何共享的文件缓存或库缓存。
方法二:用ps直接查看USS/PSS指标
如果你的ps版本支持(大部分现代Linux发行版都支持),可以直接输出更精准的内存指标:
ps -o pid,comm,pss,uss -p [pid]
- USS(Unique Set Size):进程完全独占的内存,完全不包含任何共享部分(包括共享缓存),这是最接近你要的「排除缓存后的实际内存」的指标。
- PSS(Proportional Set Size):把共享内存按共享进程的数量均分后的值(比如一个内存页被3个进程共享,每个进程算1/3的大小),这个指标更适合评估进程对系统整体内存的实际消耗。
方法三:用top或htop可视化查看
- top:进入top后按
f键,在字段列表里找到PSS或USS(不同版本可能命名略有差异),勾选后按q返回,就能在界面里看到这些指标了。 - htop:默认可能已经显示PSS,或者进入设置(按
F2),在「Columns」里添加USS或PSS字段,界面会更直观。
最后补充一句:其实没有绝对的「排除缓存后的完美内存值」,因为文件缓存是内核提升性能的机制,当系统内存不足时会自动回收。如果要评估进程必须保留的最小内存,USS是最佳选择;如果要评估进程对系统内存的实际压力,PSS会更准确。
内容的提问来源于stack exchange,提问作者Rafiq Shaikh




