vmware 下虚拟cpu和物理cpu 核的映射关系

1. 映射关系Hypervisor(例如VMware ESXi,KVM,Xen等)为了最大化性能,一般都是根据资源可用性等等来动态的调整虚拟CPU和物理CPU的映射关系的。调度vCPU的算法非常复杂多样,有简单的轮转算法(round-robin),也有复杂的考虑NUMA等内存局部性的算法。2. 是否能在虚拟机中动态获得Hypervisor是知道这些映射关系的,但是在虚拟机内部能否获取到,取决于Hypervisor是否想把这些信息暴露给虚拟机。我倾向于Hypervisor不会暴露映射关系给虚拟机,原因有两点:a,映射是动态改变的,而且改变周期不确定(有可能很长,也可能短到一个时间片);b,没有意义,如果虚拟机里面的应用需要确定的映射关系可以通过其他方式达到,例如下面的可行方案。3. 可行的解决方案看题主的问题,应该是想将虚拟机里面的某个程序(假设为P)运行到某个物理CPU(假设为PhyCore0)上。这个可以通过两层CPU Affinity设置达到。首先在VMware EXSi里面将该虚拟机的某个CPU(假设为VirtCore0)绑定到PhyCore0上(可以搜索 vmware cpu affinity),然后在虚拟机内部使用OS提供的机制将程序P绑定VirtCore0上(guest os是linux的话,可以用taskset等)。采用这个方式可能会降低一部分性能,毕竟本来有可用的CPU就能运行,现在必须等到PhyCore0空闲才能运行。当然,题主的问题是使用NUIOA,只需要把Affinity设置到一个Socket上就行,这样实际性能损失应该会较小。


    推荐阅读