今天在阅读Nginx代码时看到其中有包含CPU绑定的内容。CPU绑定对多进程应用性能如何产生影响,这里首先要从CPU高速缓存说起。

CPU缓存简介:

CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多,一般是和处理器同频运作,工作效率远远大于系统内存硬盘缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。

CPU绑定的意义:

在计算机存储系统中,按照访问速度可以分为多层,CPU缓存、内存、硬盘。在实际产品中,CPU缓存可以分为多级缓存,一般有两级缓存,部分高端产品有三级缓存,其访问速度也有较大差别。但是访问速度越快的存储器价格越贵,使用量也越少,这样就形成了一个金字塔结构,在最上面的是最快的存储器,一般为CPU的一级缓存,最下面的是最慢的存储器,一般为硬盘。如何高效使用这部分昂贵的资源,就成为我们软件开发人员关注的一个方面。默认情况下,如Linux所创建的线程可以在所有CPU上执行,但是如果该线程将执行环境从一个CPU迁移到另一个CPU时,需要将执行环境从内存载入第二个CPU中的缓存当中,这一过程会降低处理速度。同时之前的CPU中的缓存内容也因为不再使用而从CPU缓存中换出到内存中,这一过程同样会降低处理速度。如何解决这一问题,现代操作系统一般都提供了CPU绑定功能,该功能可以将线程绑定到一个或者几个CPU上,使其不再被操作系统调度到其他CPU上,这样提高了CPU缓存命中率,进而提高了处理速度和效率。下面我们介绍在AIX,linux下CPU绑定相关的系统函数。

 

AIX下CPU绑定系统函数:

#include <sys/processor.h>
int bindprocessor ( int What, int Who, cpu_t Where)


     What描述绑定进程或者线程到指定CPU:BINDPROCESS绑定进程;BINDTHREAD绑定线程。
     Who进程或者线程ID。

    Where如果该值是一个有效CPU标识,则绑定到该CPU;如果该值是PROCESSOR_CLASS_ANY则取消绑定,该进程或者线程可以在任何一个CPU上运行。 sysconf系统调用可以获取系统CPU个数。

 

Linux下CPU绑定函数:

#define _GNU_SOURCE             /* Seefeature_test_macros(7) */
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
       pid为进程或线程ID。
       cpusetsize一般为sizeof(cpu_set_t)
       mask为CPU设置掩码。

其他操作系统CPU绑定方法读者可自行查找。