VMware上一块物理网卡能虚拟出几块一样的虚拟网卡,那一个物理CPU是否能虚拟出多个呢,如果可以的话,岂不是能够单CPU模拟多处理并行
由于公司系统的运行环境对于多核的CPU Affinity绑定要求十分高,这样问题来了,假如安装在虚拟机里,分配了两个不同的CPU,如何能保证不会跨CPU呢,感觉想不通,试试再说
通过VMware ESXi来进行测试,宿主服务器2个物理CPU,12核
首先虚拟机属性,资源的高级CPU里关闭超线程,调度关联性选择6-11,也就是服务器硬件CPU编号
1:给虚拟机分配一个6核物理CPU
[root@localhost ~]# cat /proc/cpuinfo | grep 'physical id' physical id : 0 physical id : 0 physical id : 0 physical id : 0 physical id : 0 physical id : 0
2:给虚拟机分配两个物理CPU,每个物理CPU包含3个核,看到下面这个结果,感觉似乎摸到了一点规律,虚拟机里physical id也许就是实际的物理CPU?
[root@localhost ~]# cat /proc/cpuinfo | grep 'physical id' physical id : 0 physical id : 0 physical id : 0 physical id : 1 physical id : 1 physical id : 1
3:给虚拟机分配三个物理CPU,每个物理CPU包含1个核心,不要怀疑我,尽管真正的物理CPU只有两个,但是这里虚拟插槽数的确可以设置3个;不过有一点插槽数和每个插槽的内核数乘积不能大于12核,这个地球人都懂的
看到下面这个结果立马又凌乱了,根本没有physical,而且CPU逻辑编号0,1,2的cpu信息仅仅processor这一条不同,但是结果的确有3个CPU,可见设置虚拟卡槽的时候,超过了物理CPU的个数,的确会造成虚拟机与传统不同,起码打印的信息有所差异
processor : 2 vendor_id : GenuineIntel cpu family : 6 model : 44 model name : Intel(R) Xeon(R) CPU L5638 @ 2.00GHz stepping : 2 cpu MHz : 1999.976 cache size : 12288 KB fpu : yes fpu_exception : yes cpuid level : 11 wp : yes
4:给虚拟机分配两个物理CPU,每个CPU包含4个核心,可是看到下面这个结果我十分伤心,因为理论上我分配了6个物理核,而基本每次都可以通过physical id来看到虚拟cpu和物理cpu在id上有着对应关系,但是这里cpu id为0和为1的个数都是4个,可见这8个核都是经过虚拟机虚拟化得到的结果,因为假如与服务器物理cpu一一映射,应该会有6个1,当然这个理由有些牵强,因为一共也就分配了6-11
[root@localhost ~]# cat /proc/cpuinfo | grep 'physical id' physical id : 0 physical id : 0 physical id : 0 physical id : 0 physical id : 1 physical id : 1 physical id : 1 physical id : 1
5:为了让自己死心,分配4个虚拟卡槽,每个CPU分配2个核心,果然,都是经过虚拟化的物理CPU,不然不可能会有4个
[root@localhost ~]# cat /proc/cpuinfo | grep 'physical id' physical id : 0 physical id : 0 physical id : 1 physical id : 1 physical id : 2 physical id : 2 physical id : 3 physical id : 3
6:最后试一试westmere体系结构的CPU numa会不会改变,分配两个虚拟卡槽,每个卡槽分配4个核心,同时资源,高级CPU的调度关联性修改成0-7,这里不能瞎改,两者又要一定的关联性,也就是倍数关系,否则无法平均,设置错误了会报错的,做这个测试是为了看看是否符合westmere的cpu id编号奇偶交叉呈现
[root@localhost ~]# cat /proc/cpuinfo | grep 'physical id' physical id : 0 physical id : 0 physical id : 0 physical id : 0 physical id : 1 physical id : 1 physical id : 1 physical id : 1 [root@localhost ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 1 Core(s) per socket: 4 Socket(s): 2 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 44 Stepping: 2 CPU MHz: 1999.976 BogoMIPS: 3999.95 Hypervisor vendor: VMware Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 12288K NUMA node0 CPU(s): 0-7
最后,我终于觉悟了,完全不能拿实体的物理机与虚拟机相提并论,甚至,我还妄想想找数学规律一样找他们之间的映射关系,连NUMA架构都不一样了,其实在乎的问题有两点:
1:最终虚拟机里所有的核心是否全部都是由CPU调度关联性里设置的CPU ID虚拟出来的,如果答案是肯定的,那还要好点,只要保证调度关联性指定的ID同在一个CPU上,就不会出现跨CPU的情况,还是要手动绑核,性能应该相对受损较小
2:如何知道虚拟机里每个核所属的物理CPU,由于虚拟机本身也占用系统资源,所以虚拟机里面的操作系统肯定不可能分配服务器的所有资源,如何能将所有的核充分利用起来,而且最好能够相互不干扰,就像taskset一样,估计得了解下vcpu的原理了