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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • latex 公式如何换行

    latex 公式如何换行1、如图所示,我们先写个长公式。2、可以看到,公式没有自动换行,而是跨过了一栏。3、如图所示,在公式上下两端加上split。同时使用\\指明换行的位置。4、如图所示,公式实现了自动换行。5、大家选择换行的位置也很重要。如图所示,选择该处换行6、得到的效果就非常糟糕。承接Matlab、Python和C++的编程,机器学习、计算机视觉的理论实现及辅导,本科和硕士的均可,咸鱼交易,专业回答请走知乎,详谈请联系QQ号757160542,非诚勿扰。…

    2022年5月4日
    317
  • Android开源项目分享

    Android开源项目分享

    2022年1月8日
    48
  • springboot上传文件大小限制的配置[通俗易懂]

    springboot上传文件大小限制的配置[通俗易懂]上传文件文件过大时出现如下错误:org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException:Thefieldpicexceedsitsmaximumpermittedsizeof1048576bytes.因为springboot内置tomact的的文件传输默认…

    2022年5月25日
    46
  • matlabGUI入门

    matlabGUI入门1基础知识1.1函数1.2数据类型1.3绘图1.4其它2GUIDE2.1创建GUI界面2.2模板选择2.3控件2.4对象浏览器2.5回调函数2.6属性检查器2.7数据传输由窗口、菜单、图标、光标、按键、对话框和文本等各种图形对象组成的用户界面叫作图形用户界面(GUI)。它可以允许用户定制与MATLAB的交互方式,从而命令窗口不再是唯一与MATLAB的交互方式。用户通过鼠标或键盘选择、激活这些图形对象,使计算机产生某种动作或变化。

    2022年6月5日
    58
  • 启动mysql的命令 linux命令,linux如何启动mysql服务 linux启动mysql服务命令是什么(图文)…

    启动mysql的命令 linux命令,linux如何启动mysql服务 linux启动mysql服务命令是什么(图文)…mysql 数据库是一种开放源代码的关系型数据库管理系统 有很多朋友都在使用 一些在 linux 系统上安装了 mysql 数据库的朋友 却不知道该如何对 mysql 数据库进行配置 那么 linux 该如何启动 mysql 服务呢 接下来小编就给大家带来 linux 启动 mysql 服务的命令教程 R1d 电脑 数码 手机应用问题解决的 IT 技术网站 seo 云狐网具体步骤如下 R1d 电脑 数码 手机应用问题解决的 IT 技术网

    2025年8月31日
    0
  • Cloudsim学习笔记——基本知识

    Cloudsim学习笔记——基本知识Cloudsim澳大利亚墨尔本学校的网格实验室和Gridbus项目推出,是在离散事件模拟包SimJava上开发的函数库,继承了GridSim的编程模型,特点:支持大型云计算的基础设施的建模和仿真; 一个自足的支持数据中心、服务代理人、调度和分配策略的平台独特功能:提供虚拟化引擎,旨在数据中心节点上帮助建立和管理多重的、独立的、协调的虚拟化服务; 在对虚拟化服务分配处理核心时能够在时…

    2022年10月13日
    3

发表回复

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

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