网络栈调优98 条

ss -s 传输层总览

快速查看 socket 总量与各类状态分布, 以及 socket 缓冲内存占用, 适合作为排查的优先入口。

ss -s 传输层总览

ss -s 一次给出传输层的整体情况:socket 总数、TCP 各状态的数量分布,以及 socket 缓冲区的内存占用。它是排查连接类问题的优先入口——先看总量与状态分布是否异常,再决定往哪个方向下钻,而不是一上来就翻具体的连接列表。

基本信息

命令ss -s
输出内容Total 行、TCP 各状态计数、mem 内存统计
内存口径mem 统计的是 socket 缓冲区内存,单位为页
对照工具ss -tan 看具体状态分布,/proc/net/sockstat 看协议汇总
权限普通用户可执行

典型使用场景

  • 服务响应变慢时快速判断是否存在连接堆积
  • 检查 TIME-WAIT 数量是否异常偏高
  • 排查应用未关闭连接导致的 CLOSE-WAIT 堆积
  • 确认半连接数量,评估是否存在 SYN 洪泛
  • 估算 socket 缓冲区内存占用是否过大

总览与下钻

总览与下钻
ss -s                                 # 总量与状态分布总览
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn   # 按状态计数下钻
ss -tan state close-wait | head -20    # 定位未关闭连接的持有者
cat /proc/net/sockstat                # 协议层汇总,与 ss -s 对照

状态异常对照

现象常见原因排查动作
TIME-WAIT 数量高短连接频繁检查连接复用与内核回收参数
CLOSE-WAIT 堆积应用未关闭连接定位持有该连接的进程 fd
SYN-RECV 偏高半连接增多查看 SYN 队列与来源分布
mem 持续偏高socket 缓冲占用增长核对连接数与缓冲区设置

判读顺序

  • 先看 Total 行是否与业务规模匹配
  • 再看各状态分布,找出明显偏离常态的那一类
  • 必要时按状态过滤,定位到具体连接与进程
  • 把 socket 缓冲内存与进程内存分开统计,避免混算
  • 记录基线:把状态分布与内存占用的常态区间留存,便于异常时对比
mem 行统计的是 socket 缓冲区占用的内存页,和进程内存、内核 slab 是不同口径,直接相加会得出错误的整体内存画像。
总量正常但某一状态异常时,只看 Total 行会漏掉问题。状态分布往往比总量更能说明当前发生了什么。
在连接数剧烈变动的服务上,单次快照的价值有限:同一分钟内连续采样几次,才能区分持续高位与瞬时峰值。

易错点

  • 把 socket 缓冲内存与进程内存混算,内存画像失真
  • 只看 Total 行,忽略了单个状态异常这类关键线索
  • 看到 TIME-WAIT 偏多就立即调整内核参数,未确认是否与短连接模式有关
  • 在连接数快速变化时用瞬间快照下结论,缺少多次采样对比

数据来源与参考

  • man ss
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌