zoukankan      html  css  js  c++  java
  • 高并发下的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]

  • 相关阅读:
    第八章 多线程编程
    Linked List Cycle II
    Swap Nodes in Pairs
    Container With Most Water
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock II
    Linked List Cycle
    4Sum
    3Sum
    Integer to Roman
  • 原文地址:https://www.cnblogs.com/vinsent/p/12339848.html
Copyright © 2011-2022 走看看