2018-04-23 CPU Affinity 1

如何将所有的进程运行在一个指定的CPU上

How to run program or process on specific CPU cores on Linux

Linux 内核 API 提供了一些方法,让用户可以修改位掩码或查看当前的位掩码:

sched_set_affinity() (用来修改位掩码)
sched_get_affinity() (用来查看当前的位掩码)

sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.第二个参数cpusetsize是mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的CPU此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行.

sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程.

设置CPU affinity会导致运行速度下降吗?

./demo -n 16

使用前
time:       1m7.343s
CPU:        33%
System:     32%
Socket 0:   30%
Socket 1:   35%

使用后
time:       1m41.725s
CPU:        38%
System:     19%
Socket 0:   38%
Socket 1:   1%

线程绑定CPU核-sched_setaffinity

#include  
#include  
#include  
#include  
#include  
   
#define __USE_GNU  
#include  
#include  
#include  
#include  
#define THREAD_MAX_NUM 100  //1个CPU内的最多进程数  
   
int num=0;  //cpu中核数  
void* threadFun(void* arg)  //arg  传递线程标号(自己定义)  
{  
         cpu_set_t mask;  //CPU核的集合  
         cpu_set_t get;   //获取在集合中的CPU  
         int *a = (int *)arg;   
         printf("the a is:%d\n",*a);  //显示是第几个线程  
         CPU_ZERO(&mask);    //置空  
         CPU_SET(*a,&mask);   //设置亲和力值  
         if (sched_setaffinity(0, sizeof(mask), &mask) == -1)//设置线程CPU亲和力  
         {  
                   printf("warning: could not set CPU affinity, continuing...\n");  
         }  
         while (1)  
         {  
                   CPU_ZERO(&get);  
                   if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力  
                   {  
                            printf("warning: cound not get thread affinity, continuing...\n");  
                   }  
                   int i;  
                   for (i = 0; i < num; i++)  
                   {  
                            if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力  
                            {  
                                     printf("this thread %d is running processor : %d\n", i,i);  
                            }  
                   }  
         }  
   
         return NULL;  
}  
   
int main(int argc, char* argv[])  
{  
         num = sysconf(_SC_NPROCESSORS_CONF);  //获取核数  
         pthread_t thread[THREAD_MAX_NUM];  
         printf("system has %i processor(s). \n", num);  
         int tid[THREAD_MAX_NUM];  
         int i;  
         for(i=0;i

编译命令:gcc bind.c -o bind -lpthread
执行:./bind
输出结果:略

当然还可以对线程进行cpu绑定。
关于CPU affinity的几篇文章

[cpp] view plain copy
#define _GNU_SOURCE  
#include   
   
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,  
                          const cpu_set_t *cpuset);  
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,  
                          cpu_set_t *cpuset);  

你可能感兴趣的:(2018-04-23 CPU Affinity 1)