修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets

通过调整Linux内核参数,如开启SYNCookies、重用TIME-WAIT sockets及快速回收等,有效减少了Apache服务器上TIME-WAIT状态的TCP连接数量。
新增的一组Apache服务器上线以来,我用netstat -an命令发现服务器中有大量状态为TIME-WAIT的TCP连接,于是用/sbin/sysctl -a查看了一下Linux的各项内核参数,并翻阅有关资料,决定修改其中的两项参数,以达到减少TCP连接中TIME-WAIT sockets的目的。


vi /etc/sysctl.conf

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

引用
net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 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。
### TIME_WAIT参数的作用 TIME_WAIT状态是TCP协议中的一部分,它出现在连接的终止阶段。当一个TCP连接被关闭时,主动关闭方会进入TIME_WAIT状态。这个状态的主要作用有两个: 1. **确保最后一个确认报文能够到达对方**:如果这个ACK丢失了,那么被动关闭方会重新发送FIN,而处于TIME_WAIT状态的主机可以响应这个FIN并发送新的ACK。 2. **防止旧的报文段在新的连接中造成混乱**:通过保持一段时间(通常是2倍的最大生存时间MSL),可以保证网络上属于该连接的所有报文段都过期失效,从而避免这些报文段干扰新建立的连接[^2]。 ### TIME_WAIT时间的配置Linux系统中,可以通过调整内核参数来改变与TIME_WAIT相关的设置。主要涉及的参数位于`/proc/sys/net/ipv4/`目录下: - `tcp_fin_timeout`:此参数定义了FIN-WAIT-1状态的超时时间,也就是从发送FIN到收到其ACK的时间。这并是直接控制TIME_WAIT状态的时间长度,但它间接影响了连接关闭过程的速度。 - `tcp_tw_reuse`:启用此选项允许TIME_WAIT sockets用于新的连接,前提是这些sockets的时间戳信息足够新。 - `tcp_tw_recycle`:此选项允许快速回收TIME_WAIT sockets过需要注意的是,在某些情况下启用此功能可能导致问题,比如NAT后面的客户端可能遇到问题。 - `ip_local_port_range`:虽然这是直接控制TIME_WAIT状态的参数,但调整这个范围可以增加可用端口的数量,从而帮助减少因端口耗尽而导致的问题。 要查看当前的设置,可以使用如下命令: ```bash cat /proc/sys/net/ipv4/tcp_fin_timeout cat /proc/sys/net/ipv4/tcp_tw_reuse cat /proc/sys/net/ipv4/tcp_tw_recycle cat /proc/sys/net/ipv4/ip_local_port_range ``` 要临时修改这些参数,可以使用`echo`命令写入新的值到相应的文件中,例如: ```bash echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle ``` 要永久更改这些参数,需要编辑`/etc/sysctl.conf`文件,并添加或修改如下行: ```bash net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 ``` 然后运行`sysctl -p`以应用更改。 ### 注意事项 调整TIME_WAIT相关参数时需谨慎。当的设置可能会导致网络稳定或者性能下降。特别是`tcp_tw_recycle`和`tcp_tw_reuse`,它们对NAT环境下的连接有潜在的影响,因此建议仅在了解其影响的情况下进行调整。 此外,如果服务器面临大量的TIME_WAIT状态连接,除了调整内核参数外,还可以考虑优化应用程序的设计,如使用连接池来重用现有的连接,而是频繁地创建和关闭新的连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值