Nginx -- 9.CPU亲和

CPU亲和

CPU亲和

CPU亲和就是减少进程之间不断频繁迁移,减少性能损耗;其实就是worker_cpu_affinity参数的配置,目的将nginx worker绑定到不同核心上,这样由于worker的争抢性质,会导致所有的核心都在工作

查看当前CPU物理状态

lscpu |grep “CPU(s)”

没有服务器,随便杜撰些真实服务器的数据吧

CPU(s):                24
On-line CPU(s) list:   0-23
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22
NUMA node0 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23

上面的意思是,cpu总共24个核心,有2个物理CPU(看NUMA node0 CPU(s)行数),每一个物理CPU都是12核,0到23是它们的编号

按1
Nginx -- 9.CPU亲和

上面有几核CPU出现就表示几个核心在工作,0-3,有四个在工作(这个是我真实的虚拟机的)
如果是上面的24核的真实地服务器,可能也就%CPU8工作,也就是9个工作,CPU亲和的目的就是让24个核心全部进入工作状态,也就是lscpu会显示所有的cpu
如果就只有4核的写法就比较简单

#work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000;
#######################################################
#work绑定cpu(4work绑定8核cpu中的4个)
#worker_cpu_affinity 00000001 00000010 00000100 00001000

按照上面的写法,24核的CPU的写法是

worker_processes 24;
worker_cpu_affinity 000000000000000000000001 000000000000000000000010 000000000000000000000100 ... 100000000000000000000000

但是这样写太繁杂了
写法2,其实这种方式也很鸡肋

worker_processes 2;
worker_cpu_affinity 010101010101010101010101 101010101010101010101010;

最佳(nginx1.9推出,1.9前都是前面)

worker_processes auto;
worker_cpu_affinity auto;

先别重启Nginx
查看nginx worker进程绑定对应的cpu

ps -eo pid,args,psr|grep [n]ginx

Nginx -- 9.CPU亲和

一开始是,master绑定3;worker绑定0,1和2没用上
重启Nginx,加载配置文件
Nginx -- 9.CPU亲和

可以看到,4个核心都被用上了,而且下表为3的,master和worker都有,如果没有绑定cpu核心,那worker可能等每次加载进cpu,用的核心都不一样,每次使用cpu都要判断哪个核有空之类的检测,这样亲和就是减少cpu频繁切换的损耗

再说一下上面的数据,一开始lscpu的时候,我的4核虚拟机直接全部用上了,因为我没有服务器,所以没法展示,所以杜撰一些服务器数据来说明,其实一开始,lscpu的话,只会显示部分cpu,其他核心都是没工作的,正所谓,一核工作,多核围观,额,应该是少核工作,多核围观,然后ps进程现象0、3,如果你是服务器,也是只有两个核心被用上,比如可能是12、15,接着设置CPU亲和之后,启动就声明了master和很多worker,每个worker直接绑定cpu的核心,这样每个核心就不至于围观了

上一篇:nginx配置


下一篇:x86服务器中网络性能分析与调优(高并发、大流量网卡调优)