1. 程式人生 > >根據參數優化nginx的服務性能

根據參數優化nginx的服務性能

資產 freebsd worker second fir module context HERE 搭建服務器

一、優化nginx服務的worker進程數

在高並發、高訪問量的Web服務場景,需要事先啟動好更多的nginx進程,以保證快速響應並處理大量並發用戶的請求。

1)、優化nginx進程對應的配置

優化nginx進程對應nginx服務的配置參數如下

cat nginx.conf
worker_processes  1;    #指定了nginx要開啟的進程數,結尾的數字就是進程的個數;

上述參數調整的是nginx服務的worker進程數,nginx有master進程和worker進程之分,master進程為管理進程,真正使用的是worker進程。

2)、優化nginx進程個數的策略

搭建服務器時,worker進程數最開始的設置可以等於CPU的核數,且worker進程數要多一些,這樣起始提供服務時就不會出現因為訪問量快速增加而臨時啟動新進程提供服務的問題,縮短了系統的瞬時開銷和提供服務的時間,提升了服務用戶的速度。高流量高並發場合也可以考慮將進程數提高至CPU核數*2,具體情況要根據實際的業務來選擇,因為這個參數除了要和CPU核數匹配外,也和硬盤存儲的數據及系統的負載有關,設置為CPU的核數是一個好的起始配置,這也是官方的建議。

3)、查看Web服務器CPU硬件資產信息

查看CPU總顆數:
[root@nginx conf]# grep ‘physical id‘ /proc/cpuinfo|sort|uniq|wc -l
1

查看CPU總核數:
[root@nginx conf]# grep processor /proc/cpuinfo |wc -l
4

4)、 修改nginx配置

假設服務器的CPU顆數為1顆,核數為1核,則初始法人配置可以通過查看默認的nginx.conf裏的worker_processes數來了解,命令如下:

[root@nginx conf]# grep worker_processes nginx.conf
worker_processes  1;

這裏修改參數值為CPU的總核數4,然後從新加載nginx服務。

root@nginx conf]# vim nginx.conf
[root@nginx conf]# grep worker_processes nginx.conf
worker_processes  4;

重新加載nginx服務並檢查修改後的worker進程數量如下:

[root@nginx conf]# systemctl reload nginx
[root@nginx conf]# ps -ef|grep nginx|grep -v grep
root        748      1  0 8月31 ?       00:00:00 nginx: master process /application/nginx/sbin/nginx
www        1451    748  0 00:05 ?        00:00:00 nginx: worker process
www        1452    748  0 00:05 ?        00:00:00 nginx: worker process
www        1453    748  0 00:05 ?        00:00:00 nginx: worker process
www        1454    748  0 00:05 ?        00:00:00 nginx: worker process

從"worker_processes  4"可知,worker的進程數為4個。nginx的master主進程不包含在這個參數內,nginx master的主進程為管理進程,負責調度和管理worker進程。
有關worker_processes參數的官方說明如下:
syntax:    worker_processes number;    #此行為參數語法,number為數量;
default:   worker_processes  1;          #此行意思是不配置改參數,軟件默認情況數量為1;
context:    main                                  #此行為worker_processes參數可以放置的位置;
worker_processes 為定義worker進程數的數量,建議設置為CPU的核數或CPU核數*2,具體情況要根據實際的業務來選擇,因為這個參數除了要和CPU核數匹配外,也和硬盤存儲的數據及系統的負載有關,設置為CPU的核數是一個好的起始配置。
From:http://nginx.org/en/docs/ngx_core_module.html

二、優化綁定不同的nginx進程到不同的CPU上

默認情況下,nginx的多個進程有可能跑在某一個CPU或CPU的某一核上,導致nginx進程使用硬件的資源不均本次的優化時盡可能的分配不同的nginx進程給不同的CPU處理,達到充分有效利用硬件的多CPU多核資源的目的。

在優化不同的nginx進程對應不同的CPU配置時,四核CPU服務器的參數配置參考如下:

[root@nginx conf]# grep worker nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

worker_cpu_affinity就是配置nginx進程與CPU親和力的參數,即把不同的進程分給不同的CPU處理。這裏0001 0010 0100 1000是掩碼,分別代表第1、2、3、4核CPU,由於worker_processes進程數為4,因此,上述配置會把每一個進程分配一核CPU處理,默認情況下進程不會綁定任何CPU,參數位置為main段。

worker_cpu_affinity參數的官方說明如下:

Syntax: 	worker_cpu_affinity cpumask ...;    #此行為CPU親和力參數語法,cpumask為CPU掩碼;
worker_cpu_affinity auto [cpumask]; 
Default: 	—                     #默認不設置
Context: 	main                   #此行為worker_cpu_affinity參數可以放置的位置;

worker_cpu_affinity的作用是綁定不同的worker進程數到一組CPU上,通過設置bitmask控制進程允許使用的CPU,默認worker進程不會綁定到任何CPU。

下面是綁定的示例配置:

 Binds worker processes to the sets of CPUs. Each CPU set is represented by a bitmask of allowed CPUs. There should be a separate set defined for each of the worker processes. By default, worker processes are not bound to any specific CPUs.

For example,

    worker_processes    4;
    worker_cpu_affinity 0001 0010 0100 1000;

binds each worker process to a separate CPU, while

    worker_processes    2;
    worker_cpu_affinity 0101 1010;

binds the first worker process to CPU0/CPU2, and the second worker process to CPU1/CPU3. The second example is suitable for hyper-threading.

The special value auto (1.9.10) allows binding worker processes automatically to available CPUs:

    worker_processes auto;
    worker_cpu_affinity auto;

The optional mask parameter can be used to limit the CPUs available for automatic binding:

    worker_cpu_affinity auto 01010101;

    The directive is only available on FreeBSD and Linux. 

翻譯如下:

將工作進程綁定到CPU組。每個CPU集由允許的CPU的位掩碼表示。應該為每個工作進程定義一個單獨的集合。默認情況下,工作進程不綁定到任何特定的CPU。

例如,

worker_processes 4; 
worker_cpu_affinity 0001 0010 0100 1000;
將每個工作進程綁定到一個單獨的CPU,同時

worker_processes 2; 
worker_cpu_affinity 0101 1010;
將第一個工作進程綁定到CPU0 / CPU2,將第二個工作進程綁定到CPU1 / CPU3。第二個例子適用於超線程。

特殊值auto(1.9.10)允許將工作進程自動綁定到可用的CPU:

worker_processes auto; 
worker_cpu_affinity auto;
可選的mask參數可用於限制可用於自動綁定的CPU:

worker_cpu_affinity auto 01010101;
該指令僅適用於FreeBSD和Linux。 From:http://nginx.org/en/docs/ngx_core_module.html

四、nginx時間處理模型優化

nginx的

根據參數優化nginx的服務性能