在工作中,经常遇到无法连接问题,而产生这个问题的原因有很多种。

其中一种原因便是,本地的网络连接数达到上线了。

通常我们通过netstat 来查看服务器网络连接状况。

root@localhost [~] netstat -natp | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q  Local Address     Foreign Address  State       PID/Program name                  
tcp        0      0  10.0.1.203:42470  137.4.17.168:80  LISTEN      8361/nginx                  
tcp        0      0  10.0.1.203:39558  137.4.17.168:80  TIME_WAIT   -                  
tcp        0      0  10.0.1.203:42821  137.4.17.168:80  TIME_WAIT   -                  
tcp        0      0  10.0.1.203:38870  137.4.17.168:80  TIME_WAIT   -                  
tcp        0      0  10.0.1.203:54631  137.4.17.168:80  ESTABLISHED 5531/ftp

当我们运行的程序,网络请求没有很好的close释放时,就会导致大量的TIME_WAIT。

具体的修复办法是通过调整内核参数解决,编辑文件/etc/sysctl.conf,加入以下内容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

执行/sbin/sysctl -p,netstat参数生效。

  • net.ipv4.tcp_syncookies
  • 是否开启syncookies,默认为0,表示关闭。
    当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。

  • net.ipv4.tcp_tw_reuse
  • 连接是否允许重用,默认为0,表示关闭。
    允许将TIME-WAIT sockets重新用于新的TCP连接,可以提高连接数的利用。

  • net.ipv4.tcp_tw_recycle
  • 是否开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

  • net.ipv4.tcp_fin_timeout
  • 系統默认的TIMEOUT时间。