ss -o 是什么
连接卡住时,单看 ESTAB 状态会得出错误结论:内核可能正在反复重传。ss 加 -o 会打印每条连接的定时器信息,直接读出内核在等什么——keepalive 探活倒计时、TIME-WAIT 剩余时间、未确认数据的重传计时以及已重传次数。配合 -t 只看 TCP、-n 不做解析,是判断『表面上连接还在、实际已经不通』最快的方式。
基本信息
| 适用平台 | Linux(iproute2 的 ss,内核 4.x 以上输出稳定) |
|---|---|
| 关键选项 | -t TCP、-o 定时器、-n 数字显示、state 过滤 |
| 判读重点 | 定时器类型、剩余时间、第三个数字(重传次数) |
| 配套查看 | ss -i(拥塞与 RTT)、netstat -s/nstat(累计重传计数) |
典型使用场景
- 业务报『连接无响应』:确认内核是否已在重传并累计失败
- 数据库连接异常断开:看 keepalive 间隔与探活配置是否与中间设备的老化时间冲突
- TIME-WAIT 堆积:确认剩余时间与回收策略,判断端口耗尽风险
- 区分两类『卡住』:应用没读数据(窗口相关)与网络丢包(重传相关)
查看定时器
查看定时器
# 只看已建立连接并带定时器
ss -ton state established | head -20
# 输出示例:
# ESTAB 0 0 10.0.0.5:22 10.0.0.9:51422 timer:(keepalive,118min,0)
# ESTAB 0 132 10.0.0.5:443 10.0.0.30:49110 timer:(on,394ms,0)
# ESTAB 0 0 10.0.0.5:3306 10.0.0.8:40001 timer:(timer,1min28sec,8)
# 只看与某个对端的连接
ss -ton state established '( dport = :3306 )'定时器判读
| 输出 | 含义 | 处置建议 |
|---|---|---|
| timer:(keepalive,118min,0) | keepalive 探活,118 分钟后触发 | 正常空闲连接,不要误判为即将断开 |
| timer:(on,394ms,0) | 有未确认数据,等待 ACK 或重传计时 | 结合 Send-Q 判断是拥塞还是对端无响应 |
| timer:(timer,1min28sec,8) | 重传定时器,第三个数字 8 表示已重传 8 次 | 重点嫌疑:链路或对端实际不通 |
| Send-Q 持续不为 0 | 应用写出的数据未被确认 | 对照 timer 与重传次数判断方向 |
重传次数达到 net.ipv4.tcp_retries2(默认 15,对应约十几分钟到几十分钟)后内核才放弃连接,应用侧表现为 ETIMEDOUT。因此『连接还在』与『连接可用』是两件事。
排查时不要只看连接状态列:ESTAB 只说明状态机处于已建立,重传中的连接同样显示 ESTAB。必须结合 -o 的定时器与 -i 的 RTT 一起看。