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

  

 

 

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM