您的位置:首页 > 运维架构 > Linux

LINUX下解决time_wait连接过多和同一IP连接过多的问题

2012-08-16 13:51 531 查看
经常检查apache的连接数,会发现很多无用的time_wait连接。有人说这是正常的,是因为一个请求中途中断造成的;还有人说微软的IE连 接时产生的Time_wait会比用Firefox连接时多。个人认为有一定的Time_wait是正常的,如果超过了连接数的比例就不是很正常,所以还 是找来方法解决一下。

先检查一下time wait的值:

[root@aaa1 ~]#sysctl -a | grep time | grep wait

net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120

net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

这里解决问题的关键是如何能够重复利用time_wait的值,检查net.ipv4.tcp_tw当前值:

[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw

net.ipv4.tcp_tw_reuse = 0

net.ipv4.tcp_tw_recycle = 0

增加或修改net.ipv4.tcp_tw值,将当前的值更改为1分钟(reuse是表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接; recycle是加速TIME-WAIT sockets回收):

[root@aaa1 ~]# vi /etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

使内核参数生效:

[root@aaa1 ~]# sysctl -p

用netstat再观察时会发现已经恢复正常。

结合DDOS和TIME_WAIT过多,建议增加如下参数设置:

# Use TCP syncookies when needed

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_synack_retries=3

net.ipv4.tcp_syn_retries=3

net.ipv4.tcp_max_syn_backlog=2048

# Enable TCP window scaling

net.ipv4.tcp_window_scaling: = 1

# Increase TCP max buffer size

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

# Increase Linux autotuning TCP buffer limits

net.ipv4.tcp_rmem = 4096 87380 16777216

net.ipv4.tcp_wmem = 4096 65536 16777216

# Increase number of ports available

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 300

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 5000 65000

附:查看当前的连接数状况

netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n

1 established

1 State

2 LAST_ACK

4 CLOSING

4 FIN_WAIT2

9 LISTEN

17 FIN_WAIT1

18 SYN_RECV

27 ESTABLISHED

811 TIME_WAIT

上面的命令可以帮助分析哪种tcp状态数量异常。其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。

附:查看IP连接数状况(原文的不太准)

netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n

自己写了个更加精确的:

Shell代码


netstat -an | grep 80 | awk '{print $5}' | awk 'BEGIN {FS=":"} NF==2 {print $1} NF==5 {print $4}' | sort | uniq -c | sort -n

发现异常的,可以封了这个IP
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: