首先运行 virsh capabilities 查看物理机物理核心及其线程与逻辑处理器(线程)的关系:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
... <topology> <cells num='1'> <cell id='0'> <memory unit='KiB'>24671680</memory> <pages unit='KiB' size='4'>6167920</pages> <pages unit='KiB' size='2048'>0</pages> <distances> <sibling id='0' value='10'/> </distances> <cpus num='16'> <cpu id='0' socket_id='0' core_id='0' siblings='0,8'/> <cpu id='1' socket_id='0' core_id='1' siblings='1,9'/> <cpu id='2' socket_id='0' core_id='2' siblings='2,10'/> <cpu id='3' socket_id='0' core_id='3' siblings='3,11'/> <cpu id='4' socket_id='1' core_id='0' siblings='4,12'/> <cpu id='5' socket_id='1' core_id='1' siblings='5,13'/> <cpu id='6' socket_id='1' core_id='2' siblings='6,14'/> <cpu id='7' socket_id='1' core_id='3' siblings='7,15'/> <cpu id='8' socket_id='0' core_id='0' siblings='0,8'/> <cpu id='9' socket_id='0' core_id='1' siblings='1,9'/> <cpu id='10' socket_id='0' core_id='2' siblings='2,10'/> <cpu id='11' socket_id='0' core_id='3' siblings='3,11'/> <cpu id='12' socket_id='1' core_id='0' siblings='4,12'/> <cpu id='13' socket_id='1' core_id='1' siblings='5,13'/> <cpu id='14' socket_id='1' core_id='2' siblings='6,14'/> <cpu id='15' socket_id='1' core_id='3' siblings='7,15'/> </cpus> </cell> </cells> </topology> <cache> <bank id='0' level='3' type='both' size='8' unit='MiB' cpus='0-3,8-11'/> <bank id='1' level='3' type='both' size='8' unit='MiB' cpus='4-7,12-15'/> </cache> ... |
其中的socket_id代表CPU的槽位,core_id代表CPU物理核心,siblings表示哪些逻辑处理器(线程)是属于同一个物理核心的。
例如id为0以及8的逻辑处理器,都属于同一个CPU槽位且属于同一个物理核心。
在这台物理机上建立的虚拟机,想得到最佳的性能,首先不要跨CPU插槽,其次,不要让多个虚拟机CPU共享同一个物理核心。
根据上面的信息,4核心8线程的虚拟机CPU亲和度配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<domain> ... <vcpu placement='static'>8</vcpu> <cputune> <vcpupin vcpu='0' cpuset='0'/> <vcpupin vcpu='1' cpuset='8'/> <vcpupin vcpu='2' cpuset='1'/> <vcpupin vcpu='3' cpuset='9'/> <vcpupin vcpu='4' cpuset='2'/> <vcpupin vcpu='5' cpuset='10'/> <vcpupin vcpu='6' cpuset='3'/> <vcpupin vcpu='7' cpuset='11'/> </cputune> ... <cpu mode='host-passthrough' check='none'> <topology sockets='1' cores='4' threads='2'/> </cpu> ... </domain> |
其中vcpu 0和1在虚拟机中对应一个物理核心的两个线程,将其亲和度设定到逻辑处理器0和8,后面vcpu 2-7,同理。
启动虚拟机,通过 virsh vcpupin 进行验证:
1 2 3 4 5 6 7 8 9 10 |
VCPU: CPU Affinity ---------------------------------- 0: 0 1: 8 2: 1 3: 9 4: 2 5: 10 6: 3 7: 11 |
到虚拟机中查看/proc/cpuinfo:
1 2 3 4 5 6 7 8 9 |
# cat /proc/cpuinfo | grep "core id" core id : 0 core id : 0 core id : 1 core id : 1 core id : 2 core id : 2 core id : 3 core id : 3 |
上面输出的信息可以确定设定无误,因为第一、二个逻辑核心对应了第一个物理核心,后面第三到第八个也同理。如果输出的core id与cputune处设定时所期望的顺序不对,调整cputune中的参数即可。