38.3. 在引导时配置 HugeTLB

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

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

流程

  1. 要为 1 GB 页创建一个 HugeTLB 池,请启用 default_hugepagesz=1Ghugepagesz=1G 内核选项:

    # grubby --update-kernel=ALL --args="default_hugepagesz=1G hugepagesz=1G"
  2. /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
  3. /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
  4. 创建可执行脚本:

    # chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh
  5. 启用早期引导保留:

    # systemctl enable hugetlb-gigantic-pages
注意
  • 您可以通过在任何时候写入 nr_hugepages,来尝试在运行时保留更多 1 GB 页。但是,为了避免因为内存碎片而导致的失败,在引导过程中的早期保留 1 GB 页。
  • 保留静态巨页可有效地减少系统可用的内存量,并阻止它正确利用内存容量。虽然正确大小的保留巨页池可能会对使用它的应用程序有用,但保留巨页的过度或未使用的池最终会降低整体系统性能。当设置保留的巨页池时,请确定系统可以正确地利用其完整的内存容量。

其他资源

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