问题:
在centos7虚拟机上编译完成dpvs后,运行发现出现了如下错误:
[root@localhost bin]# ./dpvs fail to set thread affinty: Invalid argument set_all_thread_affinity failed |
查看dpvs的main.c文件可以看到报错位置如下:
// 发生错误 if (set_all_thread_affinity() != 0) { fprintf(stderr, "set_all_thread_affinity failed\n"); exit(EXIT_FAILURE); } |
而这个函数的目的是使用CPU affinity将当前进程绑定到所有的CPU核心上,对这一块不是很熟悉,以此来学习一下CPU affinity(CPU亲和力)的相关知识。
准备知识:
逻辑CPU个数的计算:逻辑CPU数量 = 物理CPU数量 x CPU cores x 2(如果支持并开启超线程技术(Hyper-Threading))
关于超线程技术,是指利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率,我们常听到的双核四线程/四核八线程指的就是支持超线程技术的CPU。
物理CPU的个数:机器上安装的实际CPU, 比如说你的主板上安装了一个8核CPU,那么物理CPU个数就是1个,所以物理CPU个数就是主板上安装的CPU个数。
因此比电脑安装了一块4核CPU,并且支持且开启了超线程(HT)技术,那么逻辑CPU数量 = 1 × 4 × 2 = 8
Linux下CPU的相关信息都存放在/proc/cpuinfo中,相关的命令如下:
# 查看物理CPU个数 cat /proc/cpuinfo|grep "physical id"|sort|uniq|wc -l
# 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo|grep "cpu cores"|uniq
# 查看逻辑CPU的个数 cat /proc/cpuinfo|grep "processor"|wc -l
# 查看CPU的名称型号 cat /proc/cpuinfo|grep "name"|cut -f2 -d:|uniq |