Linux服务器内核参数优化

Linux内核的默认设置是为通用场景准备的,在用作特定的服务器用途时,修改内核参数或者编译特定的内核版本对提高性能有许多帮助,但这也是件需要经验积累的技术工作,而且需要根据业务特点进行不同设置。这里以比较常用的以支持高并发为需求的网络服务器为例,记录一些相关参数的设置和说明。

fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 61000
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmem = 4096 32768 262142
net.ipv4.netdev_max_backlog = 8096
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn.backlog = 1024

这些参数通常可以写在/etc/sysctl.conf文件当中,然后通过sysctl -p命令使其生效。

file-max表示一个进程可以同时打开的最大句柄数,通常维持一个套接字连接至少需要占用一个句柄数,所以这个参数直接限制了最大的并发连接数。与此相关的通常还应注意Linux系统下ulimit参数的配置。

tcp_tw_reuse设置为1将允许处于TIME-WAIT状态的socket用于新的TCP连接,通过netstat可以发现服务器上经常会有处于TIME-WAIT状态的连接,而这些连接状态的改变与另一个内核参数也有关系。但通常这些资源实际都是可以立即再投入使用的,所以这个参数对于作为服务器来说是很有意义的。

tcp_keep_alive_time通常系统的默认值是2个小时,这意味着无效连接的回收可能最多会延迟2个小时,因此若不是特殊需要,其值应该设置的小一些,以加快清理无效的连接。但值得注意的是,keepalive消息也是要占用资源的,所以这个值也不能太小。 设置为600代表是10分钟,通常是比较合理的。

tcp_fin_timeout是服务器主动关闭连接时,socket维持在FIN-WAIT-2状态的最大时间,不宜太长。理由同样是为了资源的尽快回收利用。

tcp_max_tw_buckets设置了系统允许的处于TIME_WAIT套接字数量的上限,超过上限时,这些套接字将立刻被清除并打印警告。通常该参数默认值太高,对于服务器来说,TIME_WAIT状态连接过多,将会明显影响性能,应尽早发现出现的问题和释放资源。

tcp_max_syn_backlog参数决定了TCP在连接建立阶段接收SYN请求队列的最大长度,设置的大一些通常可以避免在服务器比较繁忙时Linux不至于直接丢失客户端的连接请求。

ip_local_port_range定义了本地端口的取值范围,根据实际情况可以尽可能让范围大一些。

tcp_rmemtcp_wmem定义了TCP接收和发送缓存的最小值,默认值,最大值。

netdev_max_backlog是指当网卡接收数据包的速度大于内核处理的速度时,保存这些数据包的队列最大值,设置为1024通常就比较合适了。

rmem_default,wmem_default,rmem_max,wmem_max这些参数都是与内核套接字接收和发送缓存区大小相关。与TCP的接收和发送缓存可以一起综合考虑,值得注意的是,对于TCP连接,维护这个缓存,也就是滑动窗口是需要消耗内存的。因此过大的值将容易造成内存吃紧的情况,而过小的值则会影响大数据量的传输速度,所以这些值需要根据业务特点结合硬件实际情况设定。