对于高负载服务器,为了炸干服务器资源,我们必须修改Linux的相关配置,来提供服务器的负载能力。对于服务器能够支持的TCP连接数理论上的数值大概等于IPv4的IP数目,但是由于服务器自身硬件配置以及相关内核配置的限制,服务器的连接数远远小于这个理论值。
首先对于Linux会有一个最大打开文件数的限制,这个限制数目通过下面的命令可以查看到:
ulimit -n
默认情况下,这个值通常只有1024,也就是说对于一个用户程序,可打开的文件数目是1024,修改这个值的方法是修改文件/etc/security/limits.conf.
* soft nofile 65535
* hard nofile 65535
注意这个值最大就是65535,修改保存后,重新登录即有效。
对于打开文件数,还需要修改内核配置项:fs.file-max = 1174230
,这个值默认大概是572558
修改完文件数限制后,修改修改用户程序可使用端口范围:
net.ipv4.ip_local_port_range = 1024 65535
这个值默认范围时32768 61000
,修改后可用端口增加了31000多个,对于服务器需要连接外部服务时十分有效地防止了端口不够用导致连接失败的情况。
对于TCP连接,数据发送与接收窗口也影响了TCP性能,更大的窗口意味着同时传输的数据量更多,内核空间到用户空间的复制次数减少,因此修要修改以下内核配置:
#最大的TCP数据接收窗口
net.core.rmem_max = 33554432
#最大的TCP数据发送窗口
net.core.wmem_max = 33554432
#为自动调优定义socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。
net.ipv4.tcp_rmem = 4096 16384 33554432
#为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)
net.ipv4.tcp_wmem = 4096 16384 33554432
#确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。
net.ipv4.tcp_mem = 786432 1048576 26777216
另外对于高服务在WEB服务器,通常由于浏览器端访问的不连续性,为了节省资源,需要调整网络keepalive与超时时间,值修改如下:
#这个值默认是7200秒
net.ipv4.tcp_keepalive_time = 1800
#对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。
net.ipv4.tcp_fin_timeout = 30
#能够更快地回收TIME-WAIT套接字,这个值可以根据服务器状态进行调整
net.ipv4.tcp_tw_recycle=1