smap怎么用:实测流程

smap怎么用,关键不是把文件打开,而是按问题顺序读。我实测排查时会先锁定 PID,再看汇总口径,最后回到映射明细找异常段。这样不会被几千行输出拖住,也不容易把共享内存误判成泄漏。

先给结论

我的固定用法是三步:先用 ps 或 top 找 PID,再读 /proc/PID/smaps_rollup 看总账,最后用 /proc/PID/smaps 查明细。命令很朴素:cat /proc/1234/smaps_rollup;需要明细时再 less /proc/1234/smaps。

不要一上来就翻完整 smaps。一个映射复杂的进程可能有上万行,肉眼硬看很容易丢重点。先看 Pss、Private_Dirty、Anonymous、Swap 这几个汇总值,知道问题像哪一类,再往下找。

第一步:找准PID

我通常用 ps -eo pid,ppid,comm,rss --sort=-rss | head 看内存靠前的进程。容器里要注意宿主机 PID 和容器内 PID 可能不同,进到容器看到的 1 号进程,在宿主机未必是 1。

如果是 Kubernetes,先用 kubectl top pod 确认哪个 Pod 异常,再进节点用 crictl inspect 或 nsenter 找宿主机上的真实 PID。PID 找错,后面分析再漂亮也是白忙。

想要完整资源?

会员专享,海量内容

立即查看 →

第二步:读汇总字段

smaps_rollup 里我最先看 Pss。RSS 在共享库很多的服务上会偏吓人,PSS 更适合估算它实际分摊的内存。接着看 Private_Dirty,它高,说明进程独占且已修改的页多,常见于堆、匿名 mmap、写时复制后的内存。

Anonymous 高,方向多半在堆、运行时分配、线程栈或匿名 mmap。Shared_Clean 高,常见于共享库、只读文件映射,通常不该第一时间当成泄漏。Swap 大则要把系统内存压力也纳入判断。

第三步:翻明细定位

进入完整 smaps 后,我会搜索 [heap]、[stack]、anon、deleted、具体 so 名。某些服务会 mmap 临时文件,文件被删除后还被进程持有,smaps 里常能看到路径后面带 deleted,这种情况容易造成磁盘和内存两头困惑。

看单段时别只看 Size。Size 是虚拟地址空间,可能预留很大但没真正驻留。Rss 和 Pss 才更接近当前占用,Private_Dirty 则更适合判断这段是不是进程自己改写出来的成本。

最后怎么收口

用 smap 排查的结果,最好落成一句可执行判断:内存主要在匿名私有页,下一步抓 heap;主要在文件映射,查 mmap 生命周期;主要在共享库 RSS,改用 PSS 给容量评估;Swap 明显,先处理节点压力。

它不是终点,而是分叉口。用得好,能把“内存涨了”这种大雾问题,压缩成两三个可验证方向。

常见问题

smap怎么用命令查看?

常用命令是 cat /proc/PID/smaps_rollup 查看汇总,less /proc/PID/smaps 查看明细。把 PID 替换成目标进程号即可。

smap输出太长怎么办?

先看 smaps_rollup,再在完整 smaps 中搜索 [heap]、[stack]、deleted、Anonymous 或具体库名,不要从第一行读到最后一行。

smap看Size还是RSS?

排查实际占用优先看 RSS、PSS、Private_Dirty。Size 代表虚拟映射大小,很多时候只是地址空间预留。

获取完整内容

加入会员,海量资源任你看

立即进入 →