首页/系统/Linux 内核与性能调优速查/tcp_orphan_retries 与连接关闭
网络栈调优98 条

tcp_orphan_retries 与连接关闭

控制已无进程持有的连接重试次数; FIN_WAIT 类状态堆积时, 结合该参数与孤儿计数分析。

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 计数无进程持有的连接数持续增长指向关闭流程异常

处置顺序

  • 先查应用是否正确关闭连接,这是绝大多数堆积的根因
  • 再看对端是否正常完成关闭流程
  • 确认无误后才评估该参数,并记录调整前后的观察数据
  • 调低前明确可接受的数据丢失风险
调低该参数会让内核更快放弃重试,连接回收更快,代价是已发送数据可能无法送达。用它来「解决」连接堆积,本质上是在用数据可靠性换资源回收速度。
连接关闭是双向过程,只看本端状态容易误判。排查时应同时确认对端的状态分布与关闭行为。

易错点

  • 用调参掩盖应用层的连接泄漏,问题在下一个高峰期再次出现
  • 只关注本端的 FIN_WAIT 分布,忽略对端的关闭状态
  • 把该参数调得过低,已发送数据被放弃而导致业务异常
  • 调整前不记录孤儿计数基线,事后无法证明是否有效

数据来源与参考

  • Linux Documentation/networking/ip-sysctl.txt
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌