Menu Close

24.3. 在引导时配置 HugeTLB

HugeTLB 子系统支持的页大小取决于具体架构。x86_64 架构支持 2 MB 巨页和 1 GB gigantic 节页。

这个步骤描述了如何在引导时保留 1 GB 页面。

流程

  1. 以 root 用户身份将以下行附加到 /etc/default/grub 文件中的内核命令行选项中,为 1 GB 页面创建一个 HugeTLB 池:

    default_hugepagesz=1G hugepagesz=1G
  2. 使用编辑的默认文件重新生成 GRUB2 配置:

    1. 如果您的系统使用 BIOS 固件,请执行以下命令:

      # grub2-mkconfig -o /boot/grub2/grub.cfg
    2. 如果您的系统使用 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 的新文件,并添加以下内容:

    在添加以下内容时,使用您要保留的 1GB 页面数替换 number_of_pages,并使用您要保留的节点的名称替换 node

    #!/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

    例如,要在 node0 上保留两个 1 GB 页面,在 node1 上保留 1GB 页面,将 number_of_pages 替换 2(对于 node0)和 1(对于 node1):

    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。但是,内存碎片可能会导致此类保留失败。保留 1 GB 页面的最可靠方法是,使用 hugetlb-reserve-pages.sh 脚本(在早期引导时运行)。
  • 保留静态巨页可有效地减少系统可用的内存量,并阻止它正确利用内存容量。虽然正确大小的保留巨页池可能会对使用它的应用程序有用,但保留巨页的过度或未使用的池最终会降低整体系统性能。当设置保留的巨页池时,请确定系统可以正确地利用其完整的内存容量。

其他资源

  • systemd.service(5) 手册页
  • /usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt file