优化Linux下的内核TCP参数来提高服务器负载能力
提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.
要提高Linux系统下的负载能力,可以先启用Apache的Worker模式,来提高单位时间内的并发量.但是即使这么做了,当网站发展起来之后,连接数过多的问题就会日益明显.在节省成本的情况下,可以考虑修改Linux的内核TCP/IP参数,来最大的压榨服务器的性能.
当然,如果通过修改内核参数也无法解决的负载问题,也只能考虑升级服务器了,这是硬件所限,没有办法的事.
Linux系统下,TCP/IP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口.当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源(因为关闭后进程才会退出).这个时候我们可以考虑优化TCP/IP的内核参数,来及时将TIME_WAIT状态的端口清理掉.
本文介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,不是这个原因的情况下,效果可能不明显.那么,到哪儿去查TIME_WAIT状态的连接呢?那就是使用netstat命令.我们可以输入一个复核命令,去查看当前TCP/IP连接的状态和对应的个数:
1 | $netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' |
这个命令会显示出类似下面的结果:
1 | LAST_ACK 14 |
我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口.要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接.这种情况下,我们就有必要调整下Linux的TCP/IP内核参数,让系统更快的释放TIME_WAIT连接. 我们用vim打开配置文件:
1 | $vim /etc/sysctl.conf |
然后,在这个文件中,加入下面的几行内容:
1 | net.ipv4.tcp_syncookies = 1 |
最后输入下面的命令,让内核参数生效:
1 | $/sbin/sysctl -p |
简单的说明下,上面的参数的含义:
1 | net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies.当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; |
在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御一定程度的DDoS、CC和SYN攻击,是个一举两得的做法. 此外,如果你的连接数本身就很多,我们可以再优化一下TCP/IP的可使用端口范围,进一步提升服务器的并发能力.依然是往上面的参数文件中,加入下面这些配置:
1 | net.ipv4.tcp_keepalive_time = 1200 |
这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果.一般的流量小的服务器上,没有必要去设置这几个参数.这几个参数的含义如下:
1 | net.ipv4.tcp_keepalive_time = 1200 #表示当keepalive起用的时候,TCP发送keepalive消息的频度.缺省是2小时,改为20分钟. |
经过这样的配置之后,你的服务器的TCP/IP并发能力又会上一个新台阶.