最近给一台安装了Windows Server 2003标准版的虚拟服务器分配了八个虚拟处理器,在设备管理器中,可以查看到已成功识别所有处理器,但是任务管理器的性能标签页中看到仅有四个被使用,查阅了一下微软官方的文档,发现原来标准版最多只能使用四个处理器。
解决问题的方向可以明确:让QEMU从分配多CPU,单CPU核心,改为分配单或多CPU,多CPU核心。
QEMU -smp参数
QEMU与多CPU多核心有关的参数是-smp,官方对-smp参数的解释如下:
-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]
Simulate an SMP system with n CPUs. On the PC target, up to 255 CPUs are supported. On Sparc32 target, Linux limits the number of usable CPUs to 4. For the PC target, the number
of cores per socket, the number of threads per cores and the total number of sockets can be specified. Missing values will be computed. If any on the three values is given, the
total number of CPUs n can be omitted. maxcpus specifies the maximum number of hotpluggable CPUs.
也许你和我一样,看了这些解释,感觉和没看一样。
经过数次“实战”,稍微了解了一些,因此,我就来给你解释一下n,cores,threads,sockets, maxcpus及他们之间的关系吧。
n: 虚拟CPU(vcpu)的个数,每个thread都视为一个虚拟CPU
sockets: CPU插槽数目,也就是CPU的个数
threads: 每个CPU核心拥有的线程数目
cores: 每个CPU拥有的CPU核心数目
maxcpus: 根据文档,是设置可热插拔的CPU数量,经测试,n的值不可超过maxcpus
根据对硬件的了解,可以知道,总的cores数目=cores*sockets,总的threads数目=总的cores数目*threads
我就不扯更多理论了,举例说明吧:
实例一. -smp 1,cores=1,threads=1,sockets=1
这里指定了虚拟CPU为一,CPU个数为一,核心数为一,线程数为一,那么在虚拟机中可以看到一个CPU,核心数为一,线程数为一:
实例二. -smp 2,cores=1,threads=1,sockets=2
在虚拟服务器中可以看到有两个CPU,每个CPU拥有一个核心,每个核心拥有一个线程:
实例三. -smp 16,cores=2,threads=2,sockets=4
在服务器中可以看到共有四个CPU,每个CPU拥有两个核心,每个CPU核心拥有两个线程,也就是每个CPU拥有四个线程:
那么,我要让Windows Server 2003的虚拟服务器能使用八个vcpu,只要控制socket的值小于等于4,且大于等于1就可以了:
1 |
-smp 8,cores=8,threads=1,sockets=1 |
这样虚拟服务器里面就可以看到一个CPU,每个CPU拥有八个个核心,每个核心拥有一个线程。
在LIBVIRT中的设置方法
相信大家也用LIBVIRT管理虚拟服务器,根据LIBVIRT的官方文档,有两个是控制-smp参数的。
控制vcpu的数量,也就是-smp的n的值:
1 2 3 |
<domain> <vcpu placement='static'>n</vcpu> </domain> |
控制sockets, cores, threads的值:
1 2 3 |
<cpu> <topology sockets='n1' cores='n2' threads='n3'/> </cpu> |
要让Windows Server 2003的虚拟服务器拥有一个八核八线程的CPU,LIBVIRT的XML配置文件的相关内容应该如下:
1 2 3 4 5 6 7 8 9 |
<domain type='kvm' id='1'> ... <vcpu placement='static'>8</vcpu> ... <cpu mode='host-passthrough'> <topology sockets='1' cores='8' threads='1'/> </cpu> ... </domain> |