为什么Linux系统的ECS实例中出现大量“TCP: time wait bucket table overflow”错误?

本文介绍Linux系统的ECS实例的/var/log/messages中,出现大量“TCP: time wait bucket table overflow”错误的原因和解决方案。

问题现象

Linux系统的ECS实例的/var/log/messages中,出现大量“TCP: time wait bucket table overflow”错误。

问题原因

出现该问题的原因是ECS实例中tcp的连接数太多,超出了net.ipv4.tcp_max_tw_buckets内核参数定义的值。

  • tcp_max_tw_buckets:表示系统同时保持TIME_WAIT状态的Sockets最大数量,如果超过这个数字,TIME_WAIT状态的Socket会被结束并且提示告警信息。

  • net.ipv4.tcp_max_tw_buckets:设置该参数,是为了抵御简单的DDoS攻击。若非业务需要,请不要降低此限制,如果网络条件需要比默认值高,将net.ipv4.tcp_max_tw_buckets参数的值调高或者增加内存。

解决方案

您可以调高net.ipv4.tcp_max_tw_buckets的值以解决此问题。

  1. 远程连接ECS实例。

    具体操作,请参见连接方式概述

  2. 调整net.ipv4.tcp_max_tw_buckets参数值。

    1. 执行以下命令,编辑sysctl.conf文件。

      vim /etc/sysctl.conf
    2. i键进入编辑模式。

    3. 根据业务需要,将net.ipv4.tcp_max_tw_buckets参数的值调高。

      如下所示,将net.ipv4.tcp_max_tw_buckets值设置为20000。

      net.ipv4.tcp_max_tw_buckets = 20000
    4. Esc键,输入:wq保存退出。

    5. 执行以下命令,使配置生效。

      sysctl -p
  3. 执行以下命令,可查看不同连接数的状态。

    netstat -an | grep 80 | awk '{print $6}' | sort | uniq -c | sort -rn