• Nginx最大客户连接数算法一些遐想


    Nginx最大客户连接数算法一些遐想

    现在很多互联网公司都在使用nginx,并且替换掉以前的Apachenginx的优点就不说了,浅聊两句nginx的某些配置参数找到这些参数设置的目的和关联性,并且理论计算出nginx的并发量

    废话不多说,贴跟其相关的配置选项

     

    依次讲解各个参数的用途:

    worker_processes表示开启nginxworker进程的个数,nginx启动会开两种进程,master进程用来管理调度,worker进程用来处理请求;

    上面表示两种设置方法,比如

    方法一:worker_processes auto;

      表示设置服务器cpu核数匹配开启nginx开启的worker进程数

      查看cpu核数:lscpucat /proc/cpuinfo

    方法二:nginx设置cpu亲和力

      worker_processes 8;

      worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

      00000001表示启用第一个CPU内核,00000010表示启用第二个CPU内核,以此类推

    worker_cpu_affinity表示开启八个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核,以此类推。

    这种设置方法更高效,因将每个cpu核提供给固定的worker进程服务,减少cpu上下午切换带来的资源浪费

    如果服务器cpu有限

    比如:2CPU,开启2个进程,设置如下

    worker_processes     2;

    worker_cpu_affinity 01 10;

    比如:2CPU,开启4个进程,设置如下

    worker_processes     4;

    worker_cpu_affinity 01 10 01 10;

     

    注意:本人基于nginx1.6.2版本(后面版本没有测试),压测实验证明worker_processes最多开启8个,8个以上性能没什么提升,反而稳定性变得更低。

    worker_rlimit_nofile 65535;

    这个参数表示worker进程最多能打开的文件句柄数,基于liunx系统ulimit设置

    查看系统文件句柄数最大值:ulimit -n

    注意:Linux一切皆文件,所有请求过来最终目的访问文件,所以该参数值设置等同于liunx系统ulimit设置为优

    events {

        use epoll;

        worker_connections 65535;

        multi_accept on;

    }

    events模块处理网络事件

    epoll网络模型高效(相当于建立索引查找结果)nginx配置应该启用该参数

    worker_connections:该参数表示设置一个worker进程最多开启多少线程数

    优化设置应该等同于worker_rlimit_nofile设置值,表明一个线程处理一个http请求,同时可以处理一个文件数,各个模块之间协调合作不等待。

    http {

        keepalive_timeout  65;

    keepalive_timeout该参数表示客户端和nginx之间设置http(基于tcp协议)长连接,长连接的优势不用说了吧,长连接是否打开基于业务类型

    设置65秒表示一个TCP请求保持会话时常为65秒,65秒内TCP状态码转化至TIME_WAIT转态

    如果要使该线程可以拿来重新处理其他的请求:

      方法一:TCPTIME_WAIT转换至CLOSE转态,等待60秒左右(2MLS时间:表示请求绕着全球走一圈的时间)没有得到响应自然释放连接;

      方法二:TCP复用和强制回收

          cat /etc/sysctl.conf:设置net.ipv4.tcp_tw_reusenet.ipv4.tcp_tw_recycle等参数

    上面讲解各个参数的功能,这次主要目的讲解nginx能处理客户端最大连接数,以下讲解的都是理论值(不考虑I/O调度或者网络因素等其他原因

    我们知道nginx即可以作为服务器使用,又可以作为反向代理使用,计算公式如下:

    nginx作为http服务器的时候:

        max_clients = worker_processes * worker_connections/2

    nginx作为反向代理服务器的时候:

     

        max_clients = worker_processes * worker_connections/4

    注意

    为什么除以2:该公式基于http 1.1协议,一次请求大多数浏览器发送两次连接,并不是requestresponse响应占用两个线程(很多人也是这么认为,实际情况:请求是双向的,连接是没有方向的,由上面的图可以看出来)

    为什么除以4:因nginx作为方向代理,客户端和nginx建立连接,nginx和后端服务器也要建立连接

    由此,我们可以计算nginx作为http服务器最并发量(作为反向代理服务器自己类推),可以为压测和线上环境的优化提供一些理论依据:

    单位时间(keepalive_timeout)内nginx最大并发量C

    C=worker_processes * worker_connections/2=8*65535/2

    每秒的并发量CS

    CS=worker_processes * worker_connections/(2*65)

    基于上面的公式知道,为了避免大量TCP连接time_out情况,优化过程中可以考虑这方面的原因:

    1keepalive_timeout设置时常(会话保持):可以根据业务来设置多少,因一次请求真正释放掉线程为其他的连接使用所花时间为:keepalive_timeout+2MLS

    2nginx作为反向代理使用:keepalive_timeout只是开启客户端和nginx的长连接,nginx和后端的长连接默认是没有开启的,设置如下:

        upstream test

            {

               server 172.16.34.2:8000;

          server 172.16.34.3:8000;

          server 172.16.34.4:8000;

          keepalive 60;

            }

  • 相关阅读:
    Enum和ViewState的相互转换
    【FAQ】「この Web ページがクリップボードへアクセスするのを許可しますか?」というダイアログボックスが表示される
    读取系统联系人
    二维码的生成
    android两种基本联网方式与一种第三方开源项目的使用
    读取系统短信息
    给FLASH做外部超链接
    stdafx.h
    编写程序,输出用户输入的两个数中的较大者。
    C++中的虚函数(转)
  • 原文地址:https://www.cnblogs.com/verrion/p/nginx_maximum_client_connections.html
Copyright © 2020-2023  润新知