---
title: 虚拟机使用内存大页
description: "使用内存大页的好处是能保证虚拟机的所有内存在Host上始终以大页形式存在，并且保证连续的物理内存，可以有效减少TLB Miss，显著提升内存访问密集型业务的性能。在虚拟机使用内存大页的场景下，通过关闭透明大页（参见关闭透明大页），可以减少Host侧的开销，使得虚拟机可以获得更稳定的性能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/QEMU-KVM/kunpengkvm_05_0012.html
sourcePath: /source/zh/kunpengcpfs/ecosystemEnable/QEMU-KVM/kunpengkvm_05_0012.html
indexId: 4a10c09451c9b6b293797fe8534956645cfaf62b5062bba3165a7a18ab4c2b8571
---
# 虚拟机使用内存大页

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

不同操作系统对于内存大页的单位设置存在差异，通常将内存大页设置为1GB，而本文提及的CentOS 7.6则将内存大页设置为512MB。在虚拟化环境中配置内存大页时，至少要预留总内存的15%给Host使用。


1. 在Host侧查看各个NUMA节点上的大页分配情况。
  1 cat /sys/devices/system/node/node*/meminfo | grep Huge

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

2. 配置虚拟机使用512MB内存大页。
KVM虚拟化场景下，配置内存大页时，至少要预留总内存的15%给Host。


以4U8G规格配置虚拟机为例，先在Host侧分配300个512MB内存大页。

  - CentOS

    a. 对于CentOS 7.6操作系统，编辑“/boot/efi/EFI/centos/grub.cfg”。
      1 vi /boot/efi/EFI/centos/grub.cfg

    b. 在Linux行输入以下配置。
      1 default_hugepagesz=512M hugepagesz=512M hugepages=300

      default_hugepagesz=512M表示设置系统默认的内存大页大小为512MB。 hugepagesz=512M hugepages=300表示设置300个512MB的内存大页。与default_hugepagesz不同的是，hugepagesz可以配置多个规格。

      如下所示：

  - openEuler

    a. 对于openEuler-20.03-LTS-SP1操作系统，编辑“/etc/grub2-efi.cfg”。
      1 vi /etc/grub2-efi.cfg

    b. 在Linux行输入以下配置。
      1 default_hugepagesz=512M hugepagesz=512M hugepages=256 pci=realloc

      如下所示：

    c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
3. 重启服务器。
  1 reboot

4. 重新进入操作系统后，确定内存大页配置情况。
  1 cat /proc/sys/vm/nr_hugepages

5. 在Host侧查看各个NUMA节点上的大页分配情况。
  1 cat /sys/devices/system/node/node*/meminfo | grep Huge

  此时各个NUMA节点的HugePages显示信息为75，说明此时系统已为各个NUMA节点（node0~node3）配置了75个512MB内存大页。

  如果需要查看某个NUMA节点上的大页配置情况，可以执行如下命令：

  这里以node0为例：

  1 2 cat /sys/devices/system/node/node0/hugepages/hugepages-524288kB/nr_hugepages cat /sys/devices/system/node/node0/hugepages/hugepages-524288kB/free_hugepages

  nr_hugepages显示信息为75，说明此时系统为该NUMA节点配置了75个512MB内存大页；free_hugepages显示信息为75，说明此时系统剩余75个512MB内存大页。

6. 确定hugetlbfs是否已经挂载。
  1 mount | grep hugetlbfs

  上述回显信息表示hugetlbfs已经挂载。

7. 虚拟机配置大页内存，xml配置参考如下。
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <domain type = 'KVM'> ... <memory unit='KiB'>8388608</memory> <currentMemory unit='KiB'>83886088</currentMemory> <memoryBacking> <hugepages/> </memoryBacking> <vcpu placement = 'static' cpuset='12-15'>4</vcpu> <cputune> <vcpupin vcpu='0' cpuset='12'/> <vcpupin vcpu='1' cpuset='13'/> <vcpupin vcpu='2' cpuset='14'/> <vcpupin vcpu='3' cpuset='15'/> <emulatorpin cpuset='12-15'/> </cputune> <numatune> <memory mode='strict' nodeset='0'/> </numatune> ... </domain>
