内存与 OOM58 条

smem 的 PSS 报表

smem 以 USS/PSS/RSS 三个口径输出进程与用户内存报表,PSS 按共享比例分摊,适合多进程共享库场景的真实占用评估。

什么是 smem

smem 按 PSS、USS、RSS 三种口径输出进程与用户维度的内存报表:RSS 会把共享页在每个进程里重复计算,USS 只算进程独占部分,PSS 则把共享页按引用进程数分摊,因此 PSS 汇总最接近实际物理占用。它的价值在于回答“到底是谁占用了内存”,尤其是大量进程共享同一份库或使用共享内存的场景。

基本信息

软件包smem
汇总-t(total)、-k(可读单位)
按用户-u 按用户汇总
按进程过滤-P <正则> 或 -c <命令>
口径列USS / PSS / RSS
依赖需要内核提供相应统计(CONFIG_PROC_PAGE_MONITOR)

典型使用场景

  • 多进程共享库场景下评估真实占用(如 nginx 多 worker)
  • 容器或宿主的内存归因:按用户维度看谁在涨
  • 验证 RSS 总量与物理内存的矛盾:用 PSS 汇总与 free 对照
  • 定位单个服务的独占内存(USS),判断其自身增量
  • 容量规划:以 PSS 为基准估算实际需求

常用命令

常用命令
sudo smem -tk                            # 汇总并按 PSS 排序(-k 可读单位)
sudo smem -tk -P nginx                   # 只看匹配进程
sudo smem -tk -u                         # 按用户维度汇总
sudo smem -tk -c 'java'                  # 按命令名过滤
sudo smem -tk -a                         # 显示平均 PSS
sudo smem -t -k -H -s pss                # 指定按 PSS 排序输出

三种口径对照

口径含义使用场景
USS进程独占内存判断自身增量与泄漏
PSS按共享比例分摊真实占用归因(首选)
RSS含共享的常驻内存快速排序,会重复计算
合计(PSS)更接近物理占用与 free 的可用内存对照
在容器里看到的进程集合可能受限(取决于命名空间),需要与宿主侧的报表交叉核对,才能得到完整的占用全貌。
部分内核或受限容器环境下相关统计不可用,smem 会报错或数据异常;遇到这种情况应改用 smaps_rollup 等替代口径。
PSS 同样适合用来核对容器内存:把它与 cgroup 的 memory.current 相互印证,比只依赖单一数据源更能避免误判。
smem 需要读取大量进程的内存映射,批量巡检时建议控制并发与采样频率,避免采集本身成为负担。

易错点

  • 需要内核支持相应统计,部分内核或容器环境不可用,遇到报错先确认前提条件
  • 容器内看到的进程集合受限,配合宿主侧报表核对,否则会低估整体占用
  • 拿 RSS 汇总去和物理内存对比得出“内存不够”的结论,忽略了重复计算
  • 在高频巡检脚本里反复运行 smem:它需要读取大量进程的内存映射,开销不可忽略

数据来源与参考

  • smem 官方文档(smem(8))
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌