在进行绑核操作时,可以选择按CPU绑核或按NUMA绑核,但是需要注意避免虚拟机内存访问跨die和跨片,建议不要跨die和跨片。默认情况下,不同虚拟机的vCPU可能运行在相同物理CPU核上,会造成CPU资源竞争,也会导致VMID频繁切换造成L1 TLB频繁flush,从而推高TLB miss rate,最终造成虚拟机性能下降。
- 在Linux系统中查询NUMA节点信息。

- 在Linux系统中编辑虚拟机XML配置文件,在同一个Die(同NUMA)下进行1:1绑核,配置举例如下。
1
2
3
4
5
6
7
8
9
10
11
12
|
<domain type = 'KVM'>
...
<vcpu placement = 'static' cpuset='4-7'>4</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='4'/>
<vcpupin vcpu='1' cpuset='5'/>
<vcpupin vcpu='2' cpuset='6'/>
<vcpupin vcpu='3' cpuset='7'/>
<emulatorpin cpuset='4-7'/>
</cputune>
...
</domain>
|
- 虚拟机配置使用1个NUMA通道,绑定到NUMA 0。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<domain type = 'KVM'>
...
<vcpu placement = 'static' cpuset='4-7'>4</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='4'/>
<vcpupin vcpu='1' cpuset='5'/>
<vcpupin vcpu='2' cpuset='6'/>
<vcpupin vcpu='3' cpuset='7'/>
<emulatorpin cpuset='4-7'/>
</cputune>
...
<numatune>
<memory mode='strict' nodeset='0'/>
</numatune>
...
<cpu mode='host-passthrough' check='none'>
<topology sockets='1' cores='4' threads='1'/>
<numa>
<cell id='0' cpus='0-3' memory='8388608' unit='KiB'/>
</numa>
</cpu>
...
</domain>
|
- 在严格模式(strict mode)下,不允许跨NUMA节点的内存分配。而“preferred”模式则优先从设定的NUMA节点分配内存,若该节点内存不足,再从其他NUMA节点进行分配。POC(Proof of Concept)测试和比拼测试推荐采用严格模式,因为这样可以带来大约5%的性能提升。<numa>项为虚拟机内部呈现NUMA拓扑结构提供了功能,其中cpus指定vCPU的编号,memory则指定对应vnode(虚拟节点)上的内存大小。
- <numa>项为虚拟机内部呈现NUMA拓扑结构提供了功能,其中cpus指定vCPU的编号,memory则指定对应vnode上的内存大小。
- 如果希望进一步提升虚拟机的性能,需要配置<numatune>和<cputune>,确保vCPU和对应的内存位于同一个物理NUMA节点上(即同NUMA分配)。
- 在<numatune>中,cellid与<numa>中的cell id是相互对应的。mode参数可以配置为以下几种模式:“strict”(严格从指定节点申请内存,若内存不足则操作失败)、“preferred”(优先从某一节点申请内存,若不足则尝试其他节点)、“interleave”(从指定的节点以交叉方式申请内存)。nodeset则用于指定物理NUMA节点。