什么是 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 需要读取大量进程的内存映射,批量巡检时建议控制并发与采样频率,避免采集本身成为负担。