Nginx cpu親和性調整


意義

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]#


免責聲明!

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



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