神秘的虚拟CPU以及性能考虑

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的原理了

发表回复