网站之家技术交流论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1551|回复: 1

Linux下大量的time_wait问题的解决方法

[复制链接]
发表于 2013-3-30 10:05:24 | 显示全部楼层 |阅读模式
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]}')

回复

使用道具 举报

发表于 2013-4-27 23:16:36 | 显示全部楼层
没用过linux
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|网站之家技术交流论坛 ( 粤ICP备09092995号 )

GMT+8, 2024-12-22 17:25 , Processed in 0.088491 second(s), 7 queries , File On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表