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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 新的Visual C++代码优化器

    微软在5月4日发布了新的高级代码优化器,服务于VisualC++的后端编译器。提高了代码性能,可以压缩代码体积,将编译器带入了一个新的境界。VisualC++的团队在博客上称,这将

    2021年12月23日
  • Linux源码安装_linux源码包的安装

    Linux源码安装_linux源码包的安装最近想搞条形码和二维码,于是安装zbar,好生难搞。wgethttp://downloads.sourceforge.net/project/zbar/zbar/0.10/zbar-0.10.tar.gztar-zvxfzbar-0.10.tar.gzsudoapt-getinstallpython-gtk2-devsudoapt-getinstalll

    2022年10月30日
  • TDD-LTE与FDD-LTE区别之频段分配[通俗易懂]

    TDD-LTE与FDD-LTE区别之频段分配[通俗易懂]之前转载了一个惯有TDD与FDD异同点比较的博客,看了之后觉得还是根据异同点进行分类整理一下,这样应该能够更好的有利于大家的记忆与理解。所以这一节我们就先来整理一下这两者的频段与双工方式的区别。TDD与FDD分别是时分双工和频分双工的英文简写;FDD系统在发送和接收数据上使用不同的频率,在上行和下行频率之间有双工间隔,现在常见的2G,3G制式的网络中,GSM,CDMA,WCDM

  • 破解不加微信看朋友圈「建议收藏」

    破解不加微信看朋友圈「建议收藏」有网友发邮件问,用空间万能查看器天涯,可以强制看非好友的朋友圈?今天小编就给大家说说微信朋友圈的一些事情。微信好友之间可以看到对方朋友圈每次发的一些动态记录,只要对方不设置让你看不到,就可以看到。不是微信好友想看对方朋友圈,也是可以理解的,毕竟微信朋友圈,和QQ空间设置了这个权限是需要权限才能进去的,有的网友有方法进别人设置了权限的QQ空间,那么微信的权限朋友圈其实和QQ权限空间原理是一样的。QQ空间和微信朋友圈其实是一样的意思,只是表现的形势不同,但是有的人喜欢上微信,有的人喜欢上QQ,不管你

  • 在linux中如何解压.tgz「建议收藏」

    在linux中如何解压.tgz「建议收藏」网上的方法,都不适合我这个粗人!总结一套本仙女的方法哈!比如仙女下载了一个.tgz文件到中然后首先:打开终端1,进入下载路径下,比如我的就是进入Downloads下。输入命令: cdDownloads2,解压到当前文件夹输入:tarzxvf 文件名.tgz-C./    比如我的是:tarzxvfsimple-examples.tgz-C./3,解压到指定文件夹下输入:tar …

  • 【Yocto】devtool修改源代码「建议收藏」

    【Yocto】devtool修改源代码「建议收藏」【Yocto】devtool修改源代码。

发表回复

您的电子邮箱地址不会被公开。

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