意义

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

Nginx cpu亲和性调整的更多相关文章

  1. NGINX源代码剖析 之 CPU绑定(CPU亲和性)

    作者:邹祁峰 邮箱:Qifeng.zou.job@gmail.com 博客:http://blog.csdn.net/qifengzou 日期:2014.06.12 18:44 转载请注明来自&quo ...

  2. 关于CPU亲和性的测试

    今天看到运维的同事在配置nginx的CPU亲和性时候,运维同事说他在所有的机器上都是按照8核的方式来配置worker进程的CPU亲和性的. 但我觉得就是有点不太对劲,就查了一下nginx的处理work ...

  3. Linux中CPU亲和性(affinity)

    0.准备知识 超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片, 让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和 ...

  4. 【操作系统之十二】分支预测、CPU亲和性(affinity)

    一.分支预测 当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕 ...

  5. 【转】 管理CPU 亲和性

    简单地说,CPU 亲和性(affinity) 就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性.Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affi ...

  6. linux cpu亲和性设置

    1.设置进程的cpu亲和性程序如下, #Using:g++ setCpuAffinity.c -o setCpuAffinity #include<sys/types.h> #includ ...

  7. UIO,大页内存,CPU亲和性,NUMA机制等

    Linux环境下的UIO(Userspace I/O) UIO 用户空间下驱动程序的支持机制.DPDK使用UIO机制使网卡驱动程序运行在用户态,并采用轮询和零拷贝方式从网卡收取报文,提高收发报文的性能 ...

  8. cpu亲和性绑定

    将进程与cpu绑定,最直观的好处就是减少cpu之间的cache同步和切换,提高了cpu cache的命中率,提高代码的效率.从cpu架构上,NUMA拥有独立的本地内存,节点之间可以通过互换模块做连接和 ...

  9. 设置进程的cpu亲和性

    在busybox中提供了一个名叫taskset的命令用于设置进程的cpu亲和性,让指定的进程或者程序在指定的cpu上面运行,该程序是通过调用sched_getaffinity和sched_setaff ...

随机推荐

  1. python之random随机函数

    random.random()用于生成 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成随机数 1 n: a <= n <= b.如果 ...

  2. centos7 开机启动运行脚本

    /etc/profile.d 下建立一个xxxname.sh

  3. git本地分支推送到远程分支

    1.创建的创建和初始化 创建git仓库可以在远端创建一个仓库, 然后check到本地,在本地的文件里创建工程文件,然后提交 也可以将本地现有的工程和远端的空仓库关联 本地创建了一个工程 iOSDemo ...

  4. LibUsbDotNet使用方法

    最近在用C#调试USB程序,libusb源码是C语言的,C#用起来不方便,偶然在网上看到了LibUsbDotNet,这是开源的项目,下载后参考Example,用起来非常方便. LibUsbDotNet ...

  5. Array Stack Implement using C

  6. trim配合prefix,prefixOverrides,suffix,suffixOverrides构建动态sql语句

    1.在接口构建方法 public interface EmployeeMapperDynamicSQL { //携带了哪个字段查询条件就带上这个字段的值 public List<Employee ...

  7. 常见iPhone设备尺寸及分辨率(持续更新)

    开发中常用的px与pt区别 px就是表示pixel,像素,是屏幕上显示数据的最基本的点: pt就是point,是印刷行业常用单位,等于1/72英寸. px全称为pixel,是一个点,它不是自然界的长度 ...

  8. JS - defer 和 async

    普通 <script src="script.js"></script> 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,"立 ...

  9. ApplicationSettingsBase运用

    先建一个类继承于ApplicationSettingsBase using System; using System.ComponentModel; namespace Concert.Configu ...

  10. 理解ES6中的Symbol

    一.为什么ES6引入Symbol 有时候我们在项目开发的过程中可能会遇到这样的问题,我写了一个对象,而另外的同时则在这个对象里面添加了一个属性或是方法,倘若添加的这个属性或是方法是原本的对象中本来就有 ...