博客
关于我
linux服务器大量TIME_WAIT状态问题
阅读量:791 次
发布时间:2023-02-04

本文共 1484 字,大约阅读时间需要 4 分钟。

解决TIME_WAIT过多导致无法对外建立新连接的问题

问题背景

近期在线上项目中遇到了一道难题:服务器出现大量TIME_WAIT状态的TCP连接,导致其无法与下游模块建立新HTTP连接。这一问题经过查阅经典教材和技术文章,加深了对TCP网络问题的理解。本文将详细记录解决过程。


1. 初步问题定位

通过初步查看发现,无法对外新建TCP连接时,线上服务器存在大量处于TIME_WAIT状态的TCP连接(最多的一次为单机10w+,其中引起报警的那个模块产生的TIME_WAIT约2w),导致其无法跟下游模块建立新TCP连接。


2. TCP状态迁移

TCP连接的状态机包含11个状态,TIME_WAIT是连接被一方主动关闭后进入的状态,表示等待对方的重传请求或确认。TIME_WAIT状态的持续时间由MSL(Max Segment Lifetime)决定,通常为2MSL(2分钟)。这一状态会阻止该端口立即被用于新连接。


3. 系统配置分析

通过查看系统网络配置,发现以下关键参数:

  • tcp_max_tw_buckets:默认值为180000,用于限制系统同时持有的TIME_WAIT连接数。超过该限制会销毁连接并报警。
  • tcp_tw_recycle:默认值为0,用于快速回收TIME_WAIT连接的socket资源。
  • tcp_tw_reuse:默认值为0,允许在安全条件下复用TIME_WAIT连接。

这些参数的设置直接影响了TCP连接的状态管理。


4. 问题定位

通过netstat –at | grep "TIME_WAIT"统计发现,问题机器存在大量TIME_WAIT连接。进一步分析发现,由报警模块引起的TIME_WAIT连接有2w+,占用了大量本地端口资源。这表明系统无法分配新的端口来建立新连接。


5. 解决方法

针对该问题,可以采取以下措施:

5.1 系统配置优化

  • 调大tcp_max_tw_buckets:默认值为180000,可以根据实际负载适当调大。
  • 开启tcp_tw_recycle:在shell中执行echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle,加速TIME_WAIT连接的回收。
  • 开启tcp_tw_reuse:执行echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse,允许在安全条件下复用TIME_WAIT连接。
  • 5.2 应用程序优化

  • 改用长连接:如果目标服务器支持长连接,可以减少短连接的建立频率。
  • 设置SO_LINGER选项:通过setsockopt控制socket的linger时间,优化连接释放策略。

  • 6. 注意事项

    • tcp_tw_reuse选项的使用:必须同时开启tcp_timestamps,否则tcp_tw_reuse无效。
    • 网络环境的影响:在NAT或防火墙环境下开启tcp_tw_recycle可能导致SYN包被直接丢弃,需谨慎操作。

    7. 实际案例分析

    在实际操作中,发现问题并非仅由TIME_WAIT导致。某次操作中,未仔细检查curl日志,误以为问题由TIME_WAIT引起,结果发现下游模块对访问IP进行了防攻击限制。因此,定位问题时需结合应用日志和错误信息。


    8. 总结

    TIME_WAIT过多导致无法建立新连接的主要原因是端口资源耗尽。通过调整系统配置和优化应用程序,可以有效缓解该问题。建议在实际应用中结合具体场景,灵活配置tcp_max_tw_bucketstcp_tw_recycletcp_tw_reuse选项,同时关注网络环境的影响。

    转载地址:http://wnkfk.baihongyu.com/

    你可能感兴趣的文章
    linux安装rabbitmq3.7.15教程
    查看>>
    Linux安装Redis 与 Redis基本语法
    查看>>
    Linux安装Redis及配置(超详细)
    查看>>
    Linux安装telnet - telnet不能用!提示:-bash: telnet: command not found
    查看>>
    Linux安装Tomcat
    查看>>
    Linux安装WPS (附glibc和字体安装包)
    查看>>
    Linux安装与配置
    查看>>
    Linux安装与配置SSH服务
    查看>>
    Linux安装卸载Mysql数据库
    查看>>
    linux安装卸载软件
    查看>>
    linux安装宋体
    查看>>
    LINUX安装源码软件经典三部曲
    查看>>
    linux安装目录
    查看>>
    Linux定时Job:crontab -e 与 /etc/crontab 的区别
    查看>>
    linux定时任务_linux定时任务
    查看>>
    linux实用命令详解(新建删除复制文件夹,挂载) 转
    查看>>
    linux实验结果的分析与评价,Linux操作系统实验课程探索
    查看>>
    linux审计功能及规则 (audit.rule)
    查看>>
    Linux小技巧:如何在 Linux 中复制/移动文件时显示进度条?
    查看>>
    Linux小白入门
    查看>>