意義
Nginx默認沒有開啟利用多核cpu,我們可以通過worker_processes
指令來啟動多個worker,但是worker最終運行在哪些cpu核上是系統層進行調度的;我們可以通過增加worker_cpu_affinity
指令來對worker所運行的cpu核做綁定,以此充分利用cpu多核cpu的性能。cpu是任務處理、計算最關鍵的資源,cpu核越多,性能就越好;通過將nginx worker綁定到特定的CPU上可以避免因為worker被頻繁調度帶來的CPU的cache miss和某些cpu核負載不均的問題。
配置方式
官方文檔: http://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity
配置方式1 手動綁定
需要手動寫要綁定到CPU核的配置,cpu有多少個核,就有幾位數,1代表內核開啟,0代表內核關閉
eg: 啟動4個worker,分別綁定到CPU0~CPU3上
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
or
啟動2個worker;worker 1 綁定到CPU0/CPU2上;worker 2 綁定到CPU1/CPU3上
worker_processes 2;
worker_cpu_affinity 0101 1010;
配置方式2 自動綁定(建議方式)
eg: 自適應的方式來啟動一定數量的worker,並且自動綁定到對應的cpu核心上,這里啟動的worker數量和cpu核心數相同;
The special value auto (1.9.10) allows binding worker processes automatically to available CPUs
worker_processes auto;
worker_cpu_affinity auto;
也可以通過下面的配置方式來限制CPU資源的使用,只將nginx worker綁定到特定的一些cpu核心上:
worker_cpu_affinity auto 01010101;
調整前
通過統計nginx進程運行所在的cpu核心,可以看到某些核心上有多個nginx worker進程;並且在cpu核心和線程數量的關系是變化的,這里就說明nginx的worker進程是在cpu核心之間是動態調度的;因此這種場景下發生cpu cache miss的概率就會高很多(相比不動態調度)。
# 第一次檢查
[root@thatsit conf]# ps -eo pid,ni,pri,pcpu,psr,comm|grep nginx|awk '{++s[$(NF-1)]}END{for (i in s)print "core-id",i,"\t",s[i]}'|sort -nr -k 3
core-id 20 6
core-id 22 5
core-id 5 4
core-id 3 4
core-id 0 4
core-id 25 3
core-id 2 3
core-id 7 2
core-id 4 2
core-id 27 2
core-id 24 2
core-id 6 1
core-id 26 1
core-id 11 1
core-id 1 1
[root@thatsit nginx]#
# 第二次檢查
[root@thatsit conf]# ps -eo pid,ni,pri,pcpu,psr,comm|grep nginx|awk '{++s[$(NF-1)]}END{for (i in s)print "core-id",i,"\t",s[i]}'|sort -nr -k 3
core-id 4 6
core-id 0 6
core-id 1 5
core-id 7 4
core-id 3 4
core-id 6 3
core-id 5 2
core-id 27 2
core-id 24 2
core-id 23 2
core-id 26 1
core-id 25 1
core-id 21 1
core-id 20 1
core-id 11 1
[root@thatsit conf]#
PS:兩次檢查操作的時間間隔非常短,在幾秒之內;
配置Nginx CPU親和性
之前Nginx的worker數量是auto的(worker_processes auto;
),但是沒有配置worker_cpu_affinity
;添加下這個配置;
> worker_cpu_affinity auto;
調整后確認
調整之后所有Nginx的Worker都會跟每一個邏輯核綁定,一個worker只會運行在一個核心上。下面統計中core-id 11
上有2個nginx進程的原因是:其中一個是nginx的master進程。
[root@thatsit conf]# ps -eo pid,ni,pri,pcpu,psr,comm|grep nginx|awk '{++s[$(NF-1)]}END{for (i in s)print "core-id",i,"\t",s[i]}'|sort -nr -k 3
core-id 11 2
core-id 9 1
core-id 8 1
core-id 7 1
core-id 6 1
core-id 5 1
core-id 4 1
core-id 39 1
core-id 38 1
core-id 37 1
core-id 36 1
core-id 35 1
core-id 34 1
core-id 33 1
core-id 32 1
core-id 31 1
core-id 3 1
core-id 30 1
core-id 29 1
core-id 28 1
core-id 27 1
core-id 26 1
core-id 25 1
core-id 24 1
core-id 23 1
core-id 22 1
core-id 21 1
core-id 2 1
core-id 20 1
core-id 19 1
core-id 18 1
core-id 17 1
core-id 16 1
core-id 15 1
core-id 14 1
core-id 13 1
core-id 12 1
core-id 1 1
core-id 10 1
core-id 0 1
[root@thatsit conf]#