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

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

大家好,又见面了,我是全栈君。

1 引言

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

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

2 源代码剖析

2.1 NGINX源代码

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

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

代码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源代码的实现,能够编写例如以下測试代码:

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

图1 測试代码

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

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

图2 測试之前

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

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

图3 绑定CPU0

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

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

图4 绑定CPU1

2.4 其它接口

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

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

图5 线程绑定CPU

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

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

图6 Makefile

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115375.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Flash基础知识

    http://www.cnblogs.com/sankye/articles/1638852.html向作者Sankye致敬【编写驱动之前要了解的知识】1.       硬件特性:【Flash的硬件实现机制】Flash全名叫做FlashMemory,属于非易失性存储设备(Non-volatileMemoryDevice)

    2022年4月5日
  • JS算法题 JavaScript常见算法题 基础语法案例(持续更新)2022年3月30日

    JS算法题 JavaScript常见算法题 基础语法案例(持续更新)2022年3月30日JavaScript基础案例,用法,算法题

    2022年6月23日
  • netCMS学习笔记

    netCMS学习笔记二者关系:“netCMS”出自“风讯”,“netCMS”完全开源,有相关文档资料。“风讯”开源版删除了一些源码。学习内容:一、模板实现原理   标签   netCMS自定义了一系列标签,在模版页面中插入这些标签,在发布网页时类“NetCMS.Publish.Template”用正则表达示筛选出这些标签,然后从数据库表“NT_News”中读取相应的内容,将标签替换。   模版   模版引用的CSS,图片等路径,必需是绝对路径。   前台浏览方式   分“动态”和“静态”两种模式。   在“动态”

    2022年9月30日
  • subline3 激活码(最新序列号破解)

    subline3 激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
  • 分布式锁的实现与应用场景对比

    分布式锁的实现与应用场景对比分布式锁在传统的基于数据库的架构中,对于数据的抢占问题往往是通过数据库事务(ACID)来保证的。在分布式环境中,出于对性能以及一致性敏感度的要求,使得分布式锁成为了一种比较常见而高效的解决方案。应用场景介绍:场景1:场景2:某服务提供一组任务,A请求随机从任务组中获取一个任务;B请求随机从任务组中获取一个任务。在理想的情况下,A从任务组中挑选一个任务,任务组删除该任务,B从剩下的的任务中

    2022年9月7日
  • BN 层原理解析_解析器

    BN 层原理解析_解析器1训练数据为什么要和测试数据同分布?看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角这样子,跟训练数据完全不在同一个分布上面,你觉得泛化能力能好吗?2为什么白化训练数据能够加速训练进程如下图,训练数据如果分布在右上角,我们在初始化网络参数w和b的时候,可能得到的分界面是左下角那些线,需要经过训练不断调整才能得到穿过数据点的分界面,这个…

    2022年10月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号