tcp_orphan_retries 与连接关闭
当连接已经没有进程持有时,例如进程已退出但连接仍处于关闭流程中,内核会代为继续完成关闭动作,tcp_orphan_retries 决定重试次数的上限。FIN_WAIT 类状态堆积时,根因通常是应用没有正确关闭连接,而不是这个参数设置偏大。
基本信息
| 参数名 | net.ipv4.tcp_orphan_retries |
|---|---|
| 查看 | sysctl net.ipv4.tcp_orphan_retries |
| 关联观察 | ss -tan 的 FIN_WAIT 分布、/proc/net/sockstat 的 orphan 计数 |
| 调低的后果 | 更快放弃重试,已发送数据可能丢失 |
| 适用前提 | 先确认应用侧的连接关闭逻辑是否正常 |
典型使用场景
- FIN_WAIT 类状态数量异常,确认是否与孤儿连接有关
- 应用异常退出后连接长时间未回收,评估内核关闭行为
- 内存与连接表压力排查,确认孤儿连接的规模
- 内核参数基线审计时记录该值
- 对比调整前后的孤儿计数变化
观察与查询
观察与查询
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn | head # 状态分布
awk '/^TCP:/{print}' /proc/net/sockstat # 看 orphan 计数
sysctl net.ipv4.tcp_orphan_retries # 当前重试次数
ss -tan state fin-wait-1 | head -10 # 抽样查看具体连接相关状态
| 状态 | 含义 | 判读 |
|---|---|---|
| FIN-WAIT-1 | 本端已发 FIN,等待确认 | 长时间堆积说明对端响应慢 |
| FIN-WAIT-2 | 本端 FIN 已确认,等待对端 FIN | 堆积通常与对端未关闭有关 |
| CLOSE-WAIT | 对端已关闭,本端未关 | 应用未调用关闭,属应用问题 |
| orphan 计数 | 无进程持有的连接数 | 持续增长指向关闭流程异常 |
处置顺序
- 先查应用是否正确关闭连接,这是绝大多数堆积的根因
- 再看对端是否正常完成关闭流程
- 确认无误后才评估该参数,并记录调整前后的观察数据
- 调低前明确可接受的数据丢失风险
调低该参数会让内核更快放弃重试,连接回收更快,代价是已发送数据可能无法送达。用它来「解决」连接堆积,本质上是在用数据可靠性换资源回收速度。
连接关闭是双向过程,只看本端状态容易误判。排查时应同时确认对端的状态分布与关闭行为。