1.背景:
短链接,系统频繁连接、断开,导致系统大量的TIME_WAIT,导致系统很快用光了端口,新的连接没法绑定端口,redis 报如下错误:
登陆系统发现了大量处于TIME_WAIT 状态的连接:
2.解决方法:
[root@kk-redis-device01 ~]# sysctl -w net.ipv4.tcp_tw_recycle=1
error: permission denied on key 'net.ipv4.tcp_tw_recycle'
mv /sbin/modprobe /sbin/modprobe.old
rm -f /sbin/modprobe
ln -s /bin/true /sbin/modprobe
mv /sbin/sysctl /sbin/sysctl.old
rm -f /sbin/sysctl
ln -s /bin/true /sbin/sysctl
系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决:
vi /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让参数生效。
参数解释:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间。
3.引出问题:TIME_WAIT存在的意义?
从网上找到TCP 四次挥手图解:
4.结论:
内核参数的优化是细节,尤其关注一些比较重要的、需要根据情况来优化自己的参数。