Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

7.3. 配置 HugeTLB Huge 页面

从 Red Hat Enterprise Linux 7.1 开始,可以通过两种方式保留巨页: 在引导时在运行时。在引导时进行保留会增加成功的可能性,因为内存还没有很大的碎片。但是,在 NUMA 计算机上,页面数会自动分割在 NUMA 节点之间。通过 run-time 方法,您可以为每个 NUMA 节点保留巨页。如果在引导过程中尽快执行运行时保留,则内存碎片的可能性会降低。

7.3.1. 在引导时配置大页面

要在引导时配置巨页,在内核引导命令行中添加以下参数:
hugepages
定义在启动时在内核中配置的持久大页面数量。默认值为 0。只有当系统中有足够的物理连续的空闲页面时,才可以分配巨页。此参数保留的页面不能用于其他目的。
通过更改 /proc/sys/vm/nr_hugepages 文件的值,可以在安装后调整这个值。
在 NUMA 系统中,使用这个参数分配的巨页会在节点间平均分割。您可以通过更改节点的 /sys/devices/system/node/node_id/hugepages/hugepages-1048576kB/nr_hugepages 文件在运行时将巨页分配给特定节点。
如需更多信息,请参阅包括在 /usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt 中的相关内核文档。
hugepagesz
定义在启动时在内核中配置的持久大页面大小。有效值为 2 MB 和 1 GB。默认值为 2 MB。
default_hugepagesz
定义在启动时在内核中配置的持久性巨页的默认大小。有效值为 2 MB 和 1 GB。默认值为 2 MB。
有关如何在内核引导命令行中添加参数的详情,请参考 Chapter 3。Red Hat Enterprise Linux 7 内核管理指南中的内核参数和值列表

过程 7.1. 在早期引导期间保留 1 GB 页面

HugeTLB 子系统支持的页面大小取决于架构。在 AMD64 和 Intel 64 构架中,支持 2 MB 的巨页和 1 GB 巨页。
  1. 以 root 用户身份将以下行附加到 /etc/default/grub 文件中的内核命令行选项中,为 1 GB 页面创建一个 HugeTLB 池:
    default_hugepagesz=1G hugepagesz=1G
    
  2. 使用编辑的默认 文件重新生成 GRUB2 配置。如果您的系统使用 BIOS 固件,请执行以下命令:
    # grub2-mkconfig -o /boot/grub2/grub.cfg
    
    在带有 UEFI 固件的系统中,执行以下命令:
      # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
    
  3. 创建名为 /usr/lib/systemd/system/hugetlb-gigantic-pages.service 的文件,其内容如下:
    [Unit]
    Description=HugeTLB Gigantic Pages Reservation
    DefaultDependencies=no
    Before=dev-hugepages.mount
    ConditionPathExists=/sys/devices/system/node
    ConditionKernelCommandLine=hugepagesz=1G
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/lib/systemd/hugetlb-reserve-pages.sh
    
    [Install]
    WantedBy=sysinit.target
    
  4. 创建名为 /usr/lib/systemd/hugetlb-reserve-pages.sh 的文件,其内容如下:
    #!/bin/sh
    
    nodes_path=/sys/devices/system/node/
    if [ ! -d $nodes_path ]; then
    	echo "ERROR: $nodes_path does not exist"
    	exit 1
    fi
    
    reserve_pages()
    {
    	echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages
    }
    
    reserve_pages number_of_pages node
    在最后一行中,将 number_of_pages 替换为要保留的 1GB 页面数量,将 node 替换为要保留这些页面的节点名称。

    例 7.1. 在 node0node1上保留页面

    例如,要在 node0 上保留两个 1GB 页面,并在 node1 上保留 1GB 页面,将最后一行替换为以下代码:
    reserve_pages 2 node0
    reserve_pages 1 node1
    
    您可以根据需要进行修改,或添加更多行以在其他节点中保留内存。
  5. 使脚本可执行:
    # chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh
    
  6. 启用早期引导保留:
    # systemctl enable hugetlb-gigantic-pages
    
注意
您可以在运行时尝试保留更多 1GB 页面,方法是写入 nr_hugepages。但是,为了避免因为内存碎片而出现故障,请在引导过程早期保留 1GB 页面。

7.3.2. 在运行时配置大页面

在运行时使用以下参数来影响巨页行为:
/sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages
定义分配给指定 NUMA 节点的指定大小的巨页数量。从 Red Hat Enterprise Linux 7.1 开始支持它。以下示例移动会将 twenty 2048 kB 巨页添加到 node2
# numastat -cm | egrep 'Node|Huge'
                 Node 0 Node 1 Node 2 Node 3  Total add
AnonHugePages         0      2      0      8     10
HugePages_Total       0      0      0      0      0
HugePages_Free        0      0      0      0      0
HugePages_Surp        0      0      0      0      0
# echo 20 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages
# numastat -cm | egrep 'Node|Huge'
                 Node 0 Node 1 Node 2 Node 3  Total
AnonHugePages         0      2      0      8     10
HugePages_Total       0      0     40      0     40
HugePages_Free        0      0     40      0     40
HugePages_Surp        0      0      0      0      0
/proc/sys/vm/nr_overcommit_hugepages
定义系统可以通过过量使用内存来创建和使用的额外巨页的最大数量。将任何非零值写入该文件表示系统会从内核的普通页面池中获取巨页的数量(如果持久的大页面池已耗尽)。当这些大页面变得未使用后,它们会被释放并返回到内核的普通页面池。