内存大页

目的

使用内存大页的好处是能保证虚拟机的所有内存在Host上始终以大页形式存在,并且保证物理连续,可以有效的减少TLB Miss,显著提升内存访问密集型业务的性能。在虚拟机使用内存大页的场景下,通过关闭透明大页,可以减少Host侧的开销,使得虚拟机可以获得更稳定的性能。

方法

  1. 在Host侧计算节点上查看各个NUMA节点上的大页分配情况。

    1
    cat /sys/devices/system/node/node*/meminfo | grep HugePages_Total
    

    如果HugePages信息显示为0,说明此时系统没有配置内存大页。

  1. 若未开启内存大页,先开启大页内存。若已经开启,则忽略该步骤,直接执行配置虚拟机使用内存大页

    编辑“/boot/efi/EFI/centos/grub.cfg”,添加内容参考如下:

    1
    default_hugepagesz=512M hugepagesz=512M hugepages=300
    

    参数含义如下:

    • hugepages :在内核中定义开机启动时就分配的永久大页面的数量。默认为 0,即不分配。只有当系统有足够的连续可用页时,分配才会成功。由该参数保留的页不能用于其他用途。
    • hugepagesz: 在内核中定义了开机启动时分配的大页面的大小。
    • default_hugepagesz:在内核中定义了开机启动时分配的大页面的默认大小。

    如下所示:

    不同OS对于内存大页的单位设置不一样,本指导中CentOS 7.6设置为512MB。虚拟化场景,配置内存大页时,至少要预留总内存的15%给Host。用户可据自身业务需求及环境上内存配置计算大页。

  1. 重启服务器,检查内存大页情况。

    1
    cat /proc/sys/vm/nr_hugepages
    

  1. 配置虚拟机使用内存大页。

    • 方法一:使用OpenStack配置
      1
      openstack flavor set FLAVOR-NAME --property hw:mem_page_size=large
      

      之后使用该flavor创建虚拟机。

      flavor配置可以根据业务实际场景配置,mem_page_size选项参考含义如下:

      • small (default):默认情况,虚拟机使用小页。
      • large:仅对虚拟机使用大页内存,页面大小为物理机大页大小。
      • any:由程序决定使用哪种内存。
      • pagesize:指定特殊页面大小,单位KB,也可以指定单位,例如4KB,2MB,2048,1GB等。
    • 方法二:使用virsh配置

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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <domain type = 'KVM'>
      ...
      <memoryBacking>
      <hugepages>
       <page size='524288' unit='KiB' nodeset='0'/>
          </hugepages>
       </memoryBacking>
      ...
      </domain>
      

  1. 配置物理机关闭透明大页,保证性能稳定。

    1
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    

    若需要开启,则执行:

    1
    echo always > /sys/kernel/mm/transparent_hugepage/enabled
    

推荐策略

适合虚拟数量较少的场景。若虚拟机数量较多,可直接使用小页内存。

说明

大页内存可以分配给虚拟机内存,但虚拟机不一定会使用。如果虚拟机未开启使用大页内存,则会将其识别为小页。