QEMU - smp (sockets, die, core, threads)
图片使用了smms图床,特殊网络下可能无法加载;
1
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
分配核心,使用方式:
|
|
可以简单理解为一颗叶子节点为线程(逻辑核心)的满二叉树:
逻辑处理器数量:
$$ n=sockets*dies*clusters*cores*threads $$
其中,maxcpus
是QEMU为热插拔设置的属性,在此不展开;
参数 | 对应的物理对象 | 参数作用 |
---|---|---|
sockets | CPU插槽 | CPU插槽数目 |
dies | CPU晶片 | 每个CPU有几块承载核心的晶片 |
clusters | 晶片上的CPU簇 | / |
cores | CPU核心 | 每簇包含几个CPU |
threads | / | 每个CPU核心通过超线程支持的线程数 |
常见写法:
|
|
如果不是特殊用途,可以不考虑那么多,直接指定逻辑核心数:
|
|
分配多少核心合适?一半的核心就是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 |