感谢支持
我们一直在努力

解决Linux下大量的time_wait问题

vi /etc/sysctl.conf


编辑/etc/sysctl.conf文件,增加三行:


引用


net.ipv4.tcp_fin_timeout = 30


net.ipv4.tcp_keepalive_time = 1200


net.ipv4.tcp_syncookies = 1


net.ipv4.tcp_tw_reuse = 1


net.ipv4.tcp_tw_recycle = 1


net.ipv4.ip_local_port_range = 1024    65000


net.ipv4.tcp_max_syn_backlog = 8192


net.ipv4.tcp_max_tw_buckets = 5000


net.ipv4.route.gc_timeout = 100


net.ipv4.tcp_syn_retries = 1


net.ipv4.tcp_synack_retries = 1


说明:


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,表示关闭。


再执行以下命令,让修改结果立即生效:


引用


/sbin/sysctl -p


用以下语句看了一下服务器的TCP状态:


引用


netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’


返回结果如下:


ESTABLISHED 1423


FIN_WAIT1 1


FIN_WAIT2 262


SYN_SENT 1


TIME_WAIT 962


效果:处于TIME_WAIT状态的sockets从原来的10000多减少到1000左右。处于SYN_RECV等待处理状态的sockets为0,原来的为50~300。

通过上面的设置以后,你可能会发现一个新的问题,就是netstat时可能会出现这样的警告:


引用


warning, got duplicate tcp line


这正是上面允许tcp复用产生的警告,不过这不算是什么问题,总比不允许复用而给服务器带来很大的负载合算的多


尽管如此,还是有解决办法的:


1、 安装rpm包:


[root@root2 opt]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm


Preparing…                ########################################### [100%]


1:net-tools              ########################################### [100%]


[root@root2 opt]#


对于下载的是源码的rpm则需要使用以下方法安装:


2、 安装rpm源码包方法:


a)         安装src.rpm:


# [root@root1 opt]# rpm -i net-tools-1.60-62.1.src.rpm


……


b)        制作rpm安装包:


[root@root1 opt]# cd /usr/src/RedHat/SPECS/


[root@root1 SPECS]# rpmbuild -bb net-tools.spec


c)        rpm包的升级安装:


[root@root1 SPECS]# pwd


/usr/src/redhat/SPECS


[root@root1 SPECS]# cd ../RPMS/x86_64/


[root@root1 x86_64]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm


3、 再使用netstat来检查时系统正常:


说明:


  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 = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。


  net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。


  net.ipv4.ip_local_port_range = 1024    65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。


  net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。


  net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。


net.ipv4.route.gc_timeout = 100  路由缓存刷新频率, 当一个路由失败后多长时间跳到另一个


默认是300


net.ipv4.tcp_syn_retries = 1  对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。


netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’)

赞(0) 打赏
转载请注明出处:服务器评测 » 解决Linux下大量的time_wait问题
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏