更新时间:2021-03-18 GMT+08:00
分享

NUMA亲和性

目的

虚拟机在绑核时可以按P绑核、按NUMA绑核,但是不同NUMA内的CPU core访问同一个位置的内存性能不同。内存访问延时从高到低为:跨CPU > 跨NUMA不跨CPU > NUMA内,因此在应用程序运行时要尽可能的避免跨NUMA和跨片访问内存。好的NUMA绑核策略可以更好的降低访问时延。

方法

方法一:使用OpenStack配置

  1. 设置flavor为NUMA亲和,使用1个NUMA节点,FLAVOR-NAME为创建的实例类型名称。

    1
    openstack flavor set FLAVOR-NAME --property hw:numa_nodes=1
    
    • 如果numa_nodes = 1,Scheduler将会选择出单个NUMA节点能够满足虚拟机flavor配置的计算节点。
    • 如果numa_nodes > 1,Scheduler将会选择出NUMA节点数量以及NUMA节点中资源情况能够满足虚拟机flavor配置的计算节点。

  2. 使用flavor创建虚拟机。

方法二:使用virsh配置(推荐)

  1. 在物理机上查看NUMA节点信息。

    1
    numactl -H
    

    若未安装numactl工具,可以执行下面命令安装:

    yum install numactl

  2. 输出样例如下所示,代表0-23号CPU在NUMA node 0上,24-47号CPU在node 1上。

  3. 在计算节点上编辑虚拟机xml配置文件,在同die下进行绑核,查询实例方法参考虚拟机绑核,配置文件举例如下:

     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>
    <memmode cellid='0' mode='strict' nodeset='0'/>
    </numatune>
    ...
    <cpu mode='host-passthrough' check='none'>
    <topology sockets='4' cores='1' threads='1'/>
    <numa>
    <cell id='0' cpus='0-3' memory='83886088' unit='KiB'/>
    </numa>
    </cpu>
    ...
    </domain>
    

推荐策略

内存分配优先推荐使用不跨die+strict模式。

如果希望虚拟机有更好的性能,需要配置<numatune>和<cputune>,使vcpu和对应的内存在同一个NUMA节点上。

内存分配模式上,优先选择strict模式。strict模式不允许内存跨NUMA分配,preferred优先从设定NUMA分配,若内存不足,则从其他NUMA分配。。

分享:

    相关文档

    相关产品

close