码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-06-15 18:53:27      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   tar   ext   color   


1 引言

  非统一内存访问(NUMA)是一种用于多处理器的电脑记忆体设计,内存访问时间取决于处理器的内存位置。 在NUMA下,处理器访问它自己的本地存储器的速度比非本地存储器(存储器的地方到另一个处理器之间共享的处理器或存储器)快一些。

  针对NUMA架构系统的特点,可以通过将进程/线程绑定指定CPU(一个或多个)的方式,提高CPU CACHE的命中率,减少进程/线程迁移CPU造成的内存访问的时间消耗,从而提高程序的运行效率。[注:关于CPU亲和性的概念,可参考《管理处理器的亲和性》]


2 源码剖析

2.1 NGINX源码

  NGINX进程绑定CPU的代码非常简单,其中的核心接口为sche_setaffinity(),如下所示:

bubuko.com,布布扣

代码1 绑定CPU

2.2 源码分析

  经分析可知:

  1) 1进程可绑定到1个或多个CPU核

  -> 如果cpu_affinity的值对应的二进制值为以下值时,那么进程将绑定到第7和第63个CPU。(从0开始,下同)

10000000 00000000

00000000 00000000

00000000 00000000

00000000 10000000

  -> 如果cpu_affinity的值对应的二进制值为以下值时,那么进程将绑定到第2、第3和第7个CPU。

00000000 00000000

00000000 00000000

00000000 00000000

00000000 10001100

  其他情况可以依此类推。

  2) 该函数可设置CPU核范围:第0~63个.因为参数cpu_affinity的类型为uint64_t,其占用64位.

2.3 测试实例

  根据NGINX源码的实现,可以编写如下测试代码:

bubuko.com,布布扣

图1 测试代码

1) 测试之前:CPU0和CPU1的消耗都很低

bubuko.com,布布扣

图2 测试之前

2) 绑定CPU0:CPU0的使用接近100%,而CPU1基本不变

bubuko.com,布布扣

图3 绑定CPU0

2) 绑定CPU1:CPU1的使用接近100%,而CPU0基本不变

bubuko.com,布布扣

图4 绑定CPU1

2.4 其他接口

  除了sched_setaffinity()可以设置“进程/线程”的CPU亲和性外,还可以使用pthread_setaffinity_np()设置“线程”的CPU亲和性。参考代码如下

bubuko.com,布布扣

图5 线程绑定CPU

  以上代码对应的Makefile如下:

bubuko.com,布布扣

图6 Makefile

NGINX源码剖析 之 CPU绑定(CPU亲和性),布布扣,bubuko.com

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

标签:style   blog   http   tar   ext   color   

原文地址:http://blog.csdn.net/qifengzou/article/details/30073975

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!