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



    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開始,下同)

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

    图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

  • 相关阅读:
    spring-boot、spring-data-jpa整合
    Executors中的几种线程调用方式
    通过BeanFactoryPostProcessor来获取bean
    spring、spring-data-redis整合使用
    java.io几种读写文件的方式
    springmvc+quartz简单实现定时调度
    httpclient跳过https请求的验证
    Gson的几种使用方式
    httpclient的几种请求URL的方式
    【转】文件各种上传,离不开的表单
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5381182.html
Copyright © 2020-2023  润新知