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時間的片大小
[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