ss -m用于分析套接字内存占用,显示接收/发送缓冲区实际用量(r/t)与上限(rb/tb)等关键字段,结合-p、state过滤及系统参数可精准定位应用读取慢、连接堆积或缓冲区配置异常问题。

要分析 Linux 系统中套接字的内存占用,核心是使用 ss -m 选项。它会为每个 socket 显示接收(Recv)和发送(Send)缓冲区的当前用量、最大限制及内存页统计,这对排查连接堆积、缓冲区溢出或内存泄漏非常关键。
查看所有 TCP 连接的内存使用情况
运行以下命令可列出全部 TCP 套接字及其内存详情:
-
ss -t -m:仅 TCP,显示内存字段(如skmem:(r0,rb212992,t0,tb46080,f0,w0,o0,bl0,d0)) -
ss -t -a -m:包含监听中和已建立的连接,更全面 -
ss -t -l -m:只看监听端口的 socket 内存,适合检查服务启动后缓冲区预分配情况
理解内存字段含义
输出中 skmem: 后的括号内各参数代表:
-
r:当前接收队列字节数(Recv-Q 实际值) -
rb:接收缓冲区总大小(receive buffer size) -
t:当前发送队列字节数(Send-Q 实际值) -
tb:发送缓冲区总大小(send buffer size) -
f:待释放内存页数(fragments) -
w:写队列中等待发送的数据页数 -
o:未确认的重传数据页数 -
bl:backlog 队列中排队连接数(对监听 socket 有意义)
例如 skmem:(r128000,rb262144,t0,tb16384,...) 表示该连接已积压 128KB 接收数据,但接收缓冲上限为 256KB —— 若 r 持续接近 rb,说明应用读取太慢,可能造成丢包或连接卡顿。
结合进程与状态过滤定位问题 socket
内存异常常伴随特定状态或进程,建议组合使用:
-
ss -t -m -p -n state established | grep -v "uid:":查已建立连接中内存占用高的进程(需 root 权限才能看到 -p) -
ss -t -m -n state close-wait | awk '$2>100000 {print}':筛选Close-Wait状态且接收缓冲超 100KB 的连接,典型表现为服务端未及时 close,客户端已断连但数据滞留 -
ss -t -m -n dst 192.168.1.100:8080:针对某远端地址+端口,观察其连接的缓冲区是否持续增长
辅助判断与调优提示
仅看 ss -m 输出还不够,需关联系统行为:
- 若大量 socket 的
rb或tb值固定为 212992 / 16384 等常见值,说明应用未显式调用setsockopt(SO_RCVBUF/SO_SNDBUF),使用的是内核默认值 - 对比
/proc/sys/net/ipv4/tcp_rmem和tcp_wmem,可确认全局缓冲区范围(min/default/max) - 发现某进程 socket 内存持续上涨且
r≈rb,应检查该进程日志或是否卡在 read() 调用上











