zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5381182.html
Copyright © 2011-2022 走看看