Linux smem 分析内存使用情况

3次阅读

smem 是 linux 下精准统计进程物理内存占用的工具,核心指标为 uss(独占内存)、pss(共享内存均摊值)和 rss(驻留内存),其中 uss 可反映杀进程释放量,pss 总和近似系统真实内存占用。

Linux smem 分析内存使用情况

smem 是一个功能强大的 Linux 内存分析工具,能按进程、用户或映射(mapping)维度统计实际物理内存(RSS、PSS、USS)占用,比 pstop 更准确反映内存真实使用情况,尤其适合排查“内存被谁吃掉”这类问题。

理解 smem 的关键内存指标

smem 默认输出中最重要的三列是:

  • USS(Unique Set Size):进程独占的物理内存,即该进程关闭后可立即释放的内存。这是衡量“单个进程真实开销”的最干净指标。
  • PSS(Proportional Set Size):将共享内存(如 libc、mmap 共享段)按参与进程数均摊后的值。例如一段 4MB 的共享库被 4 个进程使用,每个进程的 PSS 只计入 1MB。PSS 总和 ≈ 系统实际物理内存占用,适合做总量估算和排序对比。
  • RSS(Resident Set Size):进程当前驻留在物理内存中的总页数,包含共享部分。容易高估单个进程影响,但仍是常用参考。

常用命令快速定位内存大户

安装后(如 ubuntu/debiansudo apt install smem),可直接运行:

  • 按 PSS 降序列出所有进程:smem -s pss -r
  • 只看前 10 名内存占用者:smem -s pss -r -n 10
  • 按用户汇总内存使用(含 PSS 总和):smem -u
  • 查看某个进程的内存映射详情(如 pid 1234):smem -P '^chrome' -m(支持正则匹配进程名)

识别共享内存与异常增长

smem -m 查看系统级内存映射,能发现哪些库或文件被大量进程共享。若某段匿名映射([anon])PSS 很高且 USS 接近 RSS,说明它几乎未被共享——可能是某个进程泄漏了私有内存。再结合 smem -p -c "pid comm uss pss rss" 输出,对比 USS 和 PSS 差距大的进程,往往意味着它加载了大量独占数据(如缓存、解压后的资源)。

配合其他工具交叉验证

smem 给出的是快照数据。若怀疑内存持续增长,可配合:

  • watch -n 2 'smem -s pss -r -n 5' 动态观察前五名变化
  • cat /proc/<pid>/smaps</pid> 查看某进程更细粒度的内存分布(如 AnonHugePages、MMAP 面积)
  • journalctl -u <service> --since "1 hour ago"</service> 检查服务日志是否伴随 OOM 或重启

不复杂但容易忽略:USS 才是判断“杀掉这个进程能回收多少内存”的可靠依据;PSS 更适合横向比较和容量规划。

text=ZqhQzanResources