1 引言

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

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

2 源代码剖析

2.1 NGINX源代码

NGINX进程绑定CPU的代码很easy,当中的核心接口为sche_setaffinity()。例如以下所看到的:

代码1 绑定CPU

2.2 源代码分析

经分析可知:

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

-> 假设cpu_affinity的值相应的二进制值为下面值时,那么进程将绑定到第7和第63个CPU。(从0開始,下同)

0000000 00000000

00000000 00000000

00000000 00000000

000000000000000

-> 假设cpu_affinity的值相应的二进制值为下面值时,那么进程将绑定到第2、第3和第7个CPU。

00000000 00000000

00000000 00000000

00000000 00000000

0000000000000

其它情况能够依此类推。

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

2.3 測试实例

依据NGINX源代码的实现,能够编写例如以下測试代码:

图1 測试代码

1) 測试之前:CPU0和CPU1的消耗都非常低

图2 測试之前

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

图3 绑定CPU0

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

图4 绑定CPU1

2.4 其它接口

除了sched_setaffinity()能够设置“进程/线程”的CPU亲和性外。还能够使用pthread_setaffinity_np()设置“线程”的CPU亲和性。參考代码例如以下:

图5 线程绑定CPU

以上代码相应的Makefile例如以下:

图6 Makefile

NGINX源代码剖析 之 CPU绑定(CPU亲和性)的更多相关文章

  1. 菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程

    菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...

  2. 菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock

    菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.cs ...

  3. 菜鸟nginx源代码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)

    菜鸟nginx源代码剖析数据结构篇(六) 哈希表 ngx_hash_t(上) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog. ...

  4. 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t

    菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...

  5. 菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t

    菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  6. 菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表ngx_chain_t

    菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog. ...

  7. 菜鸟nginx源代码剖析 配置与部署篇(一) 手把手实现nginx "I love you"

    菜鸟nginx源代码剖析 配置与部署篇(一) 手把手配置nginx "I love you" Author:Echo Chen(陈斌) Email:chenb19870707@gm ...

  8. 菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)

      菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)   Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:B ...

  9. Nginx 关于进程数 与CPU核心数相等时,进程间切换的代价是最小的-- 绑定CPU核心

    在阅读Nginx模块开发与架构模式一书时: "Nginx  上的进程数 与CPU核心数相等时(最好每个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的;" &am ...

随机推荐

  1. opencv3.0 在 android 上的使用

    下载 OpenCV-3.0.0-android-sdk-1.zip 打开 intellj,新建立一个 android 工程后选择工程属性,导入模块(Import module from externa ...

  2. “iOS 推送通知”详解:从创建到设置到运行

    这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...

  3. Asp.Net学习进度备忘(第一步:ASP.NET Web Forms)

    书签:“Web Pages”和“MVC”跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1.ASP. ...

  4. 使用FTP搭建YUM

    VSFTP搭建YUM源 1.安装FTP [root@FTP kel]# rpm -qa |grep vsftp vsftpd-2.2.2-6.el6_0.1.x86_64 首先需要安装的ftp软件为v ...

  5. JavaScript高级程序设计(第三版)第四章 变量,作用域和内存问题

    JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型值和引用类型值具有以下特点: 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中: 从一个变量向另一个变量复制 ...

  6. 使用RSA非对称密钥算法实现硬件设备授权

    一.硬件设备授权 即用户在硬件设备输入一个序列号(或一个包含授权信息的文件),然后硬件设备便可正常使用.    二.授权方案 构思授权方案时,参考了下面网址的思路: http://bbs.csdn.n ...

  7. xdebug初步

    ;加载xdebug模块. 根据PHP版本来选择是zend_extension还是zend_extension_ts  ts代表线程安全  被坑过1次zend_extension="\web\ ...

  8. [POJ] #1008# Maya Calendar : 字符处理/同余问题

    一. 题目 Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 74085   Accepted: 2 ...

  9. 使用Sunny-grok实现内网转发

    Sunny-grok 申请地址:http://www.ngrok.cc ngrok.cfg配置: server_addr: "server.ngrok.cc:4443" auth_ ...

  10. Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)

    无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...