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<stdlib.h>  
#include<stdio.h>  
#include<sys/types.h>  
#include<sys/sysinfo.h>  
#include<unistd.h>  
   
#define __USE_GNU  
#include<sched.h>  
#include<ctype.h>  
#include<string.h>  
#include<pthread.h>  
#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<num;i++)  
         {  
                   tid[i] = i;  //每个线程必须有个tid[i]  
                   pthread_create(&thread[0],NULL,threadFun,(void*)&tid[i]);  
         }  
         for(i=0; i< num; i++)  
         {  
                   pthread_join(thread[i],NULL);//等待所有的线程结束,线程为死循环所以CTRL+C结束  
         }  
         return 0;  
}  

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

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

[cpp] view plain copy
#define _GNU_SOURCE  
#include <pthread.h>  
   
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);  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容