NGINX源代码剖析 之 CPU绑定(CPU亲和性)
- 作者:邹祁峰
- 邮箱:Qifeng.zou.job@gmail.com
- 博客:http://blog.csdn.net/qifengzou
- 日期:2014.06.12 18:44
- 转载请注明来自"祁峰"的CSDN博客
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亲和性)的更多相关文章
- 菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程
菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
- 菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock
菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.cs ...
- 菜鸟nginx源代码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)
菜鸟nginx源代码剖析数据结构篇(六) 哈希表 ngx_hash_t(上) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog. ...
- 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t
菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
- 菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t
菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- 菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
菜鸟nginx源代码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog. ...
- 菜鸟nginx源代码剖析 配置与部署篇(一) 手把手实现nginx "I love you"
菜鸟nginx源代码剖析 配置与部署篇(一) 手把手配置nginx "I love you" Author:Echo Chen(陈斌) Email:chenb19870707@gm ...
- 菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)
菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:B ...
- Nginx 关于进程数 与CPU核心数相等时,进程间切换的代价是最小的-- 绑定CPU核心
在阅读Nginx模块开发与架构模式一书时: "Nginx 上的进程数 与CPU核心数相等时(最好每个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的;" &am ...
随机推荐
- php生成百度新闻源xml
<?php /* http://baike.baidu.com/view/125547.htm#2 百度网新闻开放协议 */ mysql_connect($CFG['db_host'] ,$CF ...
- 一个DataTable赋值给另一个DataTable的常用方法
DataView view = new DataView();view.Table = DataTableA;view.RowFilter = "itemType = 'book'" ...
- C++11中的右值引用
原文出处:http://kuring.me/post/cpp11_right_reference May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移 ...
- 凸包稳定性判断:每条边上是否至少有三点 POJ 1228
//凸包稳定性判断:每条边上是否至少有三点 // POJ 1228 #include <iostream> #include <cstdio> #include <cst ...
- signal()函数
转自:http://blog.csdn.net/sddzycnqjn/article/details/7285760 1. 信号概念 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件) ...
- kali 重置 mysql 密码
You can recover MySQL database server password with following five easy steps. Step # 1: Stop the My ...
- 从 Page not found: / 提示说起,我是怎么发现webstrom与myeclipse冲突问题及解决的
#从 Page not found: / 提示说起,我是怎么发现webstrom与myeclipse冲突问题的 ## 从前面发表了两篇博文,[webstorm+nodejs+JetBrains ID ...
- android学习笔记---发送状态栏通知
发送消息的代码如下: //获取通知管理器 NotificationManager mNotificationManager = (NotificationManager) getSystemServi ...
- 了解shell
1. shell 脚本文件第一行: #!/bin/sh 或 #!/bin/bash "#!" 又称为纪数,在执行bash脚本的时候,内核会根据它来确定该用哪个程序来解释脚本 ...
- 第三百三十天 how can I 坚持
今天是姥姥二周年,不是忘了,是根本就没不知道,没放在心上,正月十九,记下了,人这一辈子. 搞不懂,搞不懂那签. 锥地求泉,先难后易,顺其自然,偶遇知己,携手同行,是签文的关键,我逐个解释给你听.锥地求 ...