• Nginx核心指标优化


    目录

    一、性能优化考虑点

    1、当前系统结构瓶颈

    2、了解业务模式

    3、性能与安全

    二、系统与Nginx性能优化

    1、文件句柄

    2、cpu的亲和配置

    3、事件处理模型优化

    4、设置work_connections 连接数

    5、keepalive timeout会话保持时间

    6、GZIP压缩性能优化

    7、proxy超时设置

    8、高效传输模式

    9、Linux系统内核层面


    参考链接:Nginx 性能优化(吐血总结) - 知乎

    一、性能优化考虑点

    当我需要进行性能优化时,说明我们服务器无法满足日益增长的业务。性能优化是一个比较大的课题,需要从以下几个方面进行探讨

    • 当前系统结构瓶颈
    • 了解业务模式
    • 性能与安全

    1、当前系统结构瓶颈

    首先需要了解的是当前系统瓶颈,用的是什么,跑的是什么业务。里面的服务是什么样子,每个服务最大支持多少并发。比如针对Nginx而言,我们处理静态资源效率最高的瓶颈是多大?

    可以通过查看当前cpu负荷,内存使用率,进程使用率来做简单判断。还可以通过操作系统的一些工具来判断当前系统性能瓶颈,如分析对应的日志,查看请求数量。

    也可以通过nginx http_stub_status_module模块来查看对应的连接数,总握手次数,总请求数。也可以对线上进行压力测试,来了解当前的系统的性能,并发数,做好性能评估。

    2、了解业务模式

    虽然我们是在做性能优化,但还是要熟悉业务,最终目的都是为业务服务的。我们要了解每一个接口业务类型是什么样的业务,比如电子商务抢购模式,这种情况平时流量会很小,但是到了抢购时间,流量一下子就会猛涨。也要了解系统层级结构,每一层在中间层做的是代理还是动静分离,还是后台进行直接服务。需要我们对业务接入层和系统层次要有一个梳理

    3、性能与安全

    性能与安全也是一个需要考虑的因素,往往大家注重性能忽略安全或注重安全又忽略性能。比如说我们在设计防火墙时,如果规则过于全面肯定会对性能方面有影响。如果对性能过于注重在安全方面肯定会留下很大隐患。所以大家要评估好两者的关系,把握好两者的孰重孰轻,以及整体的相关性。权衡好对应的点。

    二、系统与Nginx性能优化

    大家对相关的系统瓶颈及现状有了一定的了解之后,就可以根据影响性能方面做一个全体的评估和优化。

    • 网络(网络流量、是否有丢包,网络的稳定性都会影响用户请求)
    • 系统(系统负载、饱和、内存使用率、系统的稳定性、硬件磁盘是否有损坏)
    • 服务(连接优化、内核性能优化、http服务请求优化都可以在nginx中根据业务来进行设置)
    • 程序(接口性能、处理请求速度、每个程序的执行效率)
    • 数据库、底层服务

    上面列举出来每一级都会有关联,也会影响整体性能,这里主要关注的是Nginx服务这一层。

    1、文件句柄

    linux/Unix上,一切皆文件,每一次用户发起请求就会生成一个文件句柄,文件句柄可以理解为就是一个索引,所以文件句柄就会随着请求量的增多,而进程调用的频率增加,文件句柄的产生就越多,系统对文件句柄默认的限制是1024个,对Nginx来说非常小了,需要改大一点

    (1)设置方式

    • 系统全局性修改
    • 用户局部性修改
    • 进程局部性修改

    (2)系统全局性修改和用户局部性修改

    vim /etc/security/limits.conf

    在End of file前面添加4个参数

    • soft:软控制,到达设定值后,操作系统不会采取措施,只是发提醒
    • hard:硬控制,到达设定值后,操作系统会采取机制对当前进程进行限制,这个时候请求就会受到影响
    • root:这里代表root用户(系统全局性修改)
    • *:代表全局,即所有用户都受此限制(用户局部性修改)
    • nofile:指限制的是文件数的配置项。后面的数字即设定的值,一般设置10000左右

    尤其在企业新装的系统,这个地方应该根据实际情况进行设置,可以设置全局的,也可以设置用户级别的

    (3)进程局部性修改

    vim /etc/nginx/nginx.conf

    每个进程的最大文件打开数,所以最好与ulimit -n的值保持一致。

    worker_rlimit_nofile 35535; #进程限制

    2、cpu的亲和配置

    cpu的亲和能够使nginx对于不同的work工作进程绑定到不同的cpu上面去。就能够减少在work间不断切换cpu,把进程通常不会在处理器之间频繁迁移,进程迁移的频率小,来减少性能损耗。

    (1)具体设置

    Nginx运行工作进程个数一般设置CPU的核心或者核心数x2。如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l。

    1. [root@lx~]# vi/usr/local/nginx1.10/conf/nginx.conf
    2. worker_processes 4;
    3. [root@lx~]# /usr/local/nginx1.10/sbin/nginx-s reload
    4. [root@lx~]# ps -aux | grep nginx |grep -v grep
    5. root 9834 0.0 0.0 47556 1948 ? Ss 22:36 0:00 nginx: master processnginx
    6. www 10135 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
    7. www 10136 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
    8. www 10137 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
    9. www 10138 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process

    比如4核配置:

    1. worker_processes 4;
    2. worker_cpu_affinity 0001 0010 0100 1000

    比如8核配置:

    1. worker_processes 8;
    2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

    worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。

    为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

    在nginx 1.9版本之后,就帮我们自动绑定了cpu;

    worker_cpu_affinity auto;

    (2)相关命令

    查看cpu核心数

    cat /proc/cpuinfo|grep "cpu cores"|uniq

    显示物理cpu数量:

    cat /proc/cpuinfo | grep "physical id"|sort|uniq|wc -l

    查看cpu使用率

    top  回车后按 1

    查看nginx使用cpu核心和对应的nginx进程号

    ps -eo pid,args,psr | grep [n]ginx

    3、事件处理模型优化

    nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。要根据系统类型不同选择不同的事务处理模型,我们使用的是Centos,因此将nginx的事件处理模型调整为epoll模型。

    1. events {
    2. worker_connections 10240; //
    3. use epoll;
    4. }

    说明:在不指定事件处理模型时,nginx默认会自动的选择最佳的事件处理模型服务。

    4、设置work_connections 连接数

     worker_connections  10240;

    5、keepalive timeout会话保持时间

    keepalive_timeout  60;

    6、GZIP压缩性能优化

    1. gzip on; #表示开启压缩功能
    2. gzip_min_length 1k; #表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩,建议设置成大于1K。如果小于1K可能会越压越大
    3. gzip_buffers 4 32k; #压缩缓存区大小
    4. gzip_http_version 1.1; #压缩版本
    5. gzip_comp_level 6; #压缩比率, 一般选择4-6,为了性能gzip_types text/css text/xml application/javascript;  #指定压缩的类型 gzip_vary on; #vary header支持

    7、proxy超时设置

    1. proxy_connect_timeout 90;
    2. proxy_send_timeout 90;
    3. proxy_read_timeout 4k;
    4. proxy_buffers 4 32k;
    5. proxy_busy_buffers_size 64k

    8、高效传输模式

    1. sendfile on; # 开启高效文件传输模式。
    2. tcp_nopush on; #需要在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量。将响应头和正文的开始部分一起发送,而不一个接一个的发送。

    9、Linux系统内核层面

    Nginx要达到最好的性能,出了要优化Nginx服务本身之外,还需要在nginx的服务器上的内核参数。

    这些参数追加到/etc/sysctl.conf,然后执行sysctl -p 生效。

    1)调节系统同时发起的tcp连接数

    net.core.somaxconn = 262144

    2)允许等待中的监听

    net.core.somaxconn = 4096 

    3) tcp连接重用

    1. net.ipv4.tcp_tw_recycle = 1
    2. net.ipv4.tcp_tw_reuse = 1

    4)不抵御洪水攻击

    1. net.ipv4.tcp_syncookies = 0
    2. net.ipv4.tcp_max_orphans = 262144 #该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,主要目的为防止Ddos攻击

    5)最大文件打开数

    在命令行中输入如下命令,即可设置Linux最大文件打开数。

    ulimit -n 30000

    以上,就把Nginx服务器高性能优化的配置介绍完了,大家可以根据我提供的方法,每个参数挨个设置一遍,看看相关的效果。这些都是一点点试出来的,这样才能更好的理解各个参数的意义。

  • 相关阅读:
    P1449 后缀表达式
    PyQt5_寻找顶(底)背离并可视化
    JUC同步锁原理源码解析一 之ReentrantLock
    Redis客户端通信RESP协议
    技术分享| anyRTC 8月更新迭代
    点击化学 PEG 试剂:1802907-92-1,Mtz-PEG4-NHS,甲基四嗪-四聚乙醇-活性酯
    Netty使用及常用组件(二)
    Unity之ShaderGraph如何实现卡通效果
    第十五届蓝桥杯c++b组赛后复盘和真题展示
    机器学习中常见的特征工程处理
  • 原文地址:https://blog.csdn.net/Zhaohui_Zhang/article/details/126271647