• nginx 性能优化的概述及在CPU资源方面的处理


    nginx的性能优化的概述

    软件层面的提升硬件的使用率

    增大CPU的利用率

    增大内存的利用率

    增大磁盘IO利用率

    增大网络带宽利用率

    提升硬件规格

    网卡:万兆网卡、例如10G、25G、40G等

    磁盘:固态硬盘,关注IOPS和BPS指标

    CPU:更快的主频,更多的核心,更大缓存,更优的架构

    内存:更快的访问速度

    超出硬件上限后使用DNS

    如何增大Nginx使用CPU的有效时长

    能够使用全部CPU资源

              master-worker进程架构

              worker进程数量应当大于等于CPU核数

    nginx进程之间不做无用功浪费CPU资源

              worker进程不应该在繁忙时,主动退出CPU   

                 worker进程间不应由争抢造成资源消耗

                 worker 进程数量应当等于CPU核数

                 worker进程不应调一些API导致主动让出CPU

                       拒绝类似的第三方模块

    不被其他进程争抢资源

          提升worker进程的优先级占用CPU更长时间

          减少操作系统上耗资源的非nginx进程

    设置worker进程数量的指令

    Syntax: worker_processes number | auto;
    Default: worker_processes 1;    指定worker进程数量
    Context: main
    

    为何一个CPU就可以同时运行多个进程

    宏观上并行,微观上串行

       把进程运行时间分为一段段的时间片

       OS调度系统依次选择每个进程,最多执行时间片指定的时长

    阻塞API引发的时间片内主动让出CPU

           速度不一致引发的阻塞API

                     硬件执行速度不一致,例如CPU和磁盘

            业务场景产生的阻塞API

                     例如同步读取网络报文

    确保进程在运行态

    R运行:正在运行或在运行队列中等待

    S中断:休眠中,受阻,在等待某个条件的形成或接受到信号

    D不可中断:收到信号不换醒和不可运行,进程必须等待直到有中断发生

    Z僵死:进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放

    T停止:进程收到SIGSTOP、SIGSTP、SIGTIN、SIGTOU 信号后停止

    减少进程间的切换

    nginx worker进程尽可能的处于R状态

         R状态的进程数量大于CPU核心时,负载急速增高

    [root@python ~]# uptime 
     10:51:14 up 17:22,  1 user,  load average: 0.00, 0.01, 0.05
    
    
    top
    top - 10:50:43 up 17:22,  1 user,  load average: 0.00, 0.01, 0.05
    Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
    

    尽可能减少进程间切换

              何为进程间切换

                   是指CPU从一个进程或者线程切换到另一个进程或者线程

                   类别:主动切换 被动切换   

                   Cost < 5us 进程切换代价,5微妙

                减少主动切换

                减少被动切换

                        增大进程优先级

    绑定CPU

    延迟处理新连接

        使用TCP_DEFER_ACCEPT 延迟处理新连接

    指令

    listen address[:port] [deferred];
    Default: listen *:80 | *:8000; 
    Context: server
    Syntax:
    

      如何查看上下文切换次数vmstat

    [root@python ~]# vmstat 
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0      0 1229020   2108 481792    0    0     2     2   17   18  0  0 100  0  0
    

      dstat查看进程上下文切换

    [root@python ~]# dstat 
    You did not select any stats, using -cdngy by default.
    ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
    usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
      0   0 100   0   0   0|4898B 5452B|   0     0 |   0     0 |  34    37 
      0   0 100   0   0   0|   0    12k|  60B  826B|   0     0 |  56    79 
      0   0 100   0   0   0|   0     0 |  60B  346B|   0     0 |  38    57 
      0   0 100   0   0   0|   0     0 |  60B  346B|   0     0 |  42    58 
      0   1  99   0   0   0|   0     0 |  60B  346B|   0     0 |  55    65 
      0   0 100   0   0   0|   0     0 |  60B  346B|   0     0 |  52    71 
      0   0 100   0   0   0|   0  4096B|  60B  346B|   0     0 |  42    61 
    

      针对进程查看

    [root@python ~]# pidstat  -w -p 30170 1
    Linux 3.10.0-957.el7.x86_64 (python) 	2019年07月19日 	_x86_64_	(2 CPU)
                                                主动切换   被动切换
    11时33分15秒   UID       PID   cswch/s nvcswch/s  Command
    11时33分16秒   997     30170      0.00      0.00  nginx
    11时33分17秒   997     30170      0.00      0.00  nginx
    11时33分18秒   997     30170      0.00      0.00  nginx
    

      控制CPU时间的片大小

    Nice 静态优先级-20-19 越小有优先级越高
    Priority 动态优先级 0-139 #define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH /2)
    [root@python ~]# top
    top - 11:49:18 up 18:20,  1 user,  load average: 0.00, 0.01, 0.05
    Tasks: 107 total,   1 running, 106 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.0 us,  5.6 sy,  0.0 ni, 94.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1863252 total,  1198048 free,   174916 used,   490288 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  1481828 avail Mem 
                     动态  静态
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                      
     30186 root      20   0  162020   2192   1548 R   5.6  0.1   0:00.03 top          
    

      设置work进程静态优先级指令

    Syntax: worker_priority number;
    Default: worker_priority 0;    默认是零,设置优先级最高的话调到-20
    Context: main
    

      worker进程间的负载均衡

    如何打开此功能

    listen指令后加reuseport
    

      CPU缓存命中率;worker进程绑定到CPU指令

    Syntax: worker_cpu_affinity cpumask ...; worker_cpu_affinity auto [cpumask];
    Default: —
    Context: main
    

      

          

    草都可以从石头缝隙中长出来更可况你呢
  • 相关阅读:
    食物链(并查集)
    字母奔跑
    19+199+1999+……+1999…9(1999个9)和是多少?
    利用union判断CPU是大端模式还是小端模式
    闰年个数(非循环)
    计算catlan数f(n)(动态规划)
    模拟循环调度(队列)
    回溯表达式,+不小于4个,乘号不小于2个,列出表达式种数
    枚举{1,2,3,4}子集
    回溯n个元素的子集
  • 原文地址:https://www.cnblogs.com/rdchenxi/p/11217294.html
Copyright © 2020-2023  润新知