图片使用了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负载
是因为操作系统以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.(协程和这个理念基本相同)
当然,超线程技术并不能让多核性能简单的x2,理想情况下可以带来20%至30%左右的性能(吞吐量)提升。
为虚拟机分配核心
QEMU使用-smp
分配核心,使用方式:
-smp [[cpus=]n][,maxcpus=maxcpus][,sockets=sockets][,dies=dies][,clusters=clusters][,cores=cores][,threads=threads]
可以简单理解为一颗叶子节点为线程(逻辑核心)的满二叉树:
逻辑处理器数量:
$$ 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 |