高并发下的Linux内核参数优化

高并发的影响因素除了硬件,Web服务器外,操作系统对TCP相关参数的配置也会对其有很大影响。
默认情况下Linux内核参数是考虑通用场景的(如ulimits -n 限定为1024),这在高并发访问的Web服务器下会造成影响。所以一般需要进行内核参数的调整,来使Web服务器(如Nginx)可以支持更高的并发。

先来回顾一下TCP的三次握手与四次挥手过程:
image.png

有了以上说明,我们来看如何修改以及需要修改哪些参数。
修改方式有sysctl命令及sysctl.conf两种:
1、 sysctl -a查看所有内核参数 , sysctl -w 参数名=值 动态写入内核参数
2、vi /etc/sysctl.conf文件就可以修改内核参数,sysctl -p 使内核参数生效

那么一般哪些参数需要修改呢:

  • fs.file-max=1024 这个参数表示一个进程可以同时打开的最大文件句柄数,对应于ulimits -n的设置。我们知道Linux下一切皆文件。那么建立一个TCP连接其实对应的也是一个sock文件。该值过小,将极大影响并发连接数。默认应该是1024
  • net.ipv4.tcp_tw_reuse=1 这个参数表示是否允许将TIME_WAIT状态的socket重新用于新的TCP连接,这对某种场景下用于客户端的服务器也是很有意义的。
  • net.ipv4.tcp_keepalive_time = 1200 这个参数表示TCP发送keepalive保活心跳的频率(注意与HTTP keepalive区分),设置小一点,可以更快地清理无效的连接,以避免资源浪费。
  • net.ipv4.tcp_max_tw_buckets =18000 表示允许处于TIME_WAIT套接字数量的最大值,默认18000。可以根据情况适当调小点,以避免资源浪费。
  • net.ipv4.tcp_max_syn_backlog = 128。TCP半连接队列的最大长度。该值是可以调大以避免Nginx来不及accept的新连接不至于被内核丢弃。
    (linux有2个队列,一个就是在握手过程中的队列(半连接,第二次握手至第三次握手期间),而另一个就是握手成功的队列(完全连接,三次握手成功后,服务端程序accept之前)
    过程如下:收到客户端的syn请求 ->将这个请求放入syn_table中去->服务器端回复syn-ack->收到客户端的ack->放入accept queue中。)
  • net.core.somaxconn = 128 每一个端口最大的监听队列的长度(完全连接)。这个就是平常编码时listen(port,backlog)中的backlog的上限值。

其他的参数调整主要是缓存方面的,如:net.ipv4.tcp_rmem,wmem。
详见内核文档:[https://github.com/torvalds/linux/blob/a72db42cee37a43f8a40e1f47358ac86921ad8e4/Documentation/networking/ip-sysctl.txt]

猜你喜欢

转载自www.cnblogs.com/vinsent/p/12339848.html