图片使用了smms图床,特殊网络下可能无法加载;

qemu-system-x86_64 -M q35 -accel kvm -cpu host -m 4096 -smp 4 -drive file=drive

前置知识:超线程——任务管理器里展示的并不是真正的CPU

测试使用的CPU为英特尔® 酷睿™ i3-12100 处理器 (intel.cn),根据规格表,一共有4颗核心。而在htop中,可以看到8个CPU负载

300d1338.png

是因为操作系统以CPU支持的线程数,作为逻辑核心展示,而不是物理核心

当CPU启用超线程后,CPU 会在每个物理内核上公开两个执行上下文,一个物理内核现在就像两个“逻辑内核”一样,可以处理不同的软件线程;

By taking advantage of idle time when the core would formerly be waiting for other tasks to complete, Intel® Hyper-Threading Technology improves CPU throughput.(协程和这个理念基本相同)

What Is Hyper-Threading? - Intel

当然,超线程技术并不能让多核性能简单的x2,理想情况下可以带来20%至30%左右的性能(吞吐量)提升。

为虚拟机分配核心

QEMU使用-smp分配核心,使用方式:

-smp [[cpus=]n][,maxcpus=maxcpus][,sockets=sockets][,dies=dies][,clusters=clusters][,cores=cores][,threads=threads]

可以简单理解为一颗叶子节点为线程(逻辑核心)的满二叉树:300d2d99.png

逻辑处理器数量:

$$ n=sockets*dies*clusters*cores*threads $$

其中,maxcpus是QEMU为热插拔设置的属性,在此不展开;

参数 对应的物理对象 参数作用
sockets CPU插槽 CPU插槽数目
dies CPU晶片 每个CPU有几块承载核心的晶片
clusters 晶片上的CPU簇 /
cores CPU核心 每簇包含几个CPU
threads / 每个CPU核心通过超线程支持的线程数

常见写法:

-smp 8,sockets=2,cores=2,threads=2,maxcpus=8
-smp 16,sockets=2,dies=2,cores=2,threads=2,maxcpus=16
-smp 16,sockets=2,clusters=2,cores=2,threads=2,maxcpus=16

如果不是特殊用途,可以不考虑那么多,直接指定逻辑核心数:

-smp 8

分配多少核心合适?一半的核心就是50%性能吗?

硬件:Intel 12100(4核8线程,无E核), DDR4 32G 3200Mhz RAM

软件:GeekBench 6.1.0

宿主机:PVE运行的QEMU Ubuntu 22.04,分配8核心、10G RAM

客户机:(嵌套虚拟化) Ubuntu 22.04,4G RAM,KVM,HOST

宿主机测试性能:单核2265、多核7711,QEMU Standard PC (i440FX + PIIX, 1996) - Geekbench

测试逻辑核心数对CPU性能的影响:

n single core multi core url
2 2219 3951 https://browser.geekbench.com/v6/cpu/2163160
3 2211 5393 https://browser.geekbench.com/v6/cpu/2155331
4 2229 6621 https://browser.geekbench.com/v6/cpu/2162777
5 2211 6804 https://browser.geekbench.com/v6/cpu/2166785
6 2227 7000 https://browser.geekbench.com/v6/cpu/2163264
7 2222 7302 https://browser.geekbench.com/v6/cpu/2163313
8 2210 7478 https://browser.geekbench.com/v6/cpu/2155189
16 2204 5938 https://browser.geekbench.com/v6/cpu/2155391