ss -m 是什么
ss 加 -m 会展开每个 socket 的 skmem 内存记账字段,用于判断『socket 到底吃了多少内存、缓冲是否被耗尽』。要区分两类数字:r/t 是当前实际分配量,rb/tb 是内核自动调优的上限;把上限当成实际占用会导致误判内存泄漏。看到 d(drop)不为零,往往正是业务侧表现为卡顿却查不到丢包的原因。
基本信息
| 适用平台 | Linux(iproute2 的 ss,内核 4.x 以上输出完整) |
|---|---|
| 关键选项 | -t TCP、-m 内存、-n 数字、state 过滤 |
| 字段含义 | r/rb 接收已分配与上限、t/tb 发送已分配与上限、w 待分配写队列 |
| 配套命令 | /proc/net/sockstat、ss -s 汇总 |
典型使用场景
- 怀疑句柄或缓冲占用过高:按状态与端口过滤,找出占用大户
- 业务卡顿但链路正常:检查 skmem 的 drop 计数是否为非零
- 排查内存增长的来源:区分内核 socket 内存与应用堆内存
- 数据库连接数评估:按端口过滤统计每个连接的缓冲占用
内存视图
内存视图
# 查看已建立连接的 socket 内存明细
ss -tmn state established | head -20
# skmem 字段示例:
# skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0)
# 只看与数据库端口相关的连接
ss -tmn '( dport = :3306 )' | head
# 汇总视角:各类 socket 数量
ss -s | head -10skmem 字段判读
| 字段 | 含义 | 判读要点 |
|---|---|---|
| r 与 rb | 接收缓冲:已分配与上限 | 判断实际占用要看 r,不要看 rb |
| t 与 tb | 发送缓冲:已分配与上限 | 配合 Send-Q 判断哪一侧在积压 |
| w | 待分配写队列字节 | 持续不为零说明写侧承压 |
| o | optmem 辅助数据缓冲 | 大量小连接时该值会明显上升 |
| d | 已丢弃字节 | 非零即为真实丢数据,需重点解释 |
rb/tb 是内核自动调优的上限而非真实占用:看到 rb=131072 不代表每个连接吃掉 128KB。判断内存是否异常,要看 r/t 的实际值以及 sockstat 的汇总趋势。
看到 d 非零时不要只调大缓冲:它说明收包时缓冲曾不足,根因可能是应用读取过慢或突发流量超出预期,需要两侧同时分析。