40.3. 在引导时配置 HugeTLB


HugeTLB 通过在引导时保留巨页来启用使用巨页,从而尽量减少内存碎片,并确保有足够的资源可用于从较大的内存页面中受益的工作负载。

40.3.1. 使用内核命令行参数配置 HugeTLB

您可以使用内核命令行参数在引导过程的最早阶段保留 HugeTLB 页面。这个方法提供了在内核启动过程中成功保留所需数量的巨页和大小的最机,因为内存是在内核启动期间分配的。

首选使用内核引导参数保留 HugeTLB 页面,因为此方法可确保与使用 systemd 单元相比,分配更大的连续内存区域。

注意

该流程中的示例演示了如何使用命令行选项配置 HugeTLB 页面。这些示例不一定适用于您的系统配置。在在您的环境中应用这些设置前,请查看您的系统要求和目标。

先决条件

  • 在您的系统中必须具有 root 权限。

流程

  • 更新内核命令行使其包含 HugeLTB 选项。

    • 为您的架构保留默认大小的 HugeTLB 页面:

      # grubby --update-kernel=ALL --args="hugepages=10"
      Copy to Clipboard Toggle word wrap

      这个命令保留默认池大小的 10 HugeTLB 页面。例如,在 x86_64 上,默认的池大小为 2 MB。在具有非统一内存访问(NUMA)的系统上,分配在 NUMA 节点上均匀分布。如果系统有两个 NUMA 节点,每个节点保留五个页面。

    • 要保留不同的 HugeTLB 页面大小,请在内核命令行中指定 hugepageszhugepages 选项:

      # grubby --update-kernel=ALL --args="hugepagesz=2M hugepages=10 hugepagesz=1G hugepages=1"
      Copy to Clipboard Toggle word wrap

      该命令保留 10 页(共 2 MB )和 1 页( 1 GB )。

      系统在引导时保留 HugeTLB 页面的指定数量和大小,确保在操作系统开始正常操作前分配内存。

      重要

      选项的顺序非常重要。每个 hugepagesz= 选项必须紧接其对应的 hugepages= 选项。

40.3.2. 使用 systemd 服务单元配置 HugeTLB

您可以使用 systemd 服务单元在用户空间引导过程中配置 HugeTLB 页面。这个方法允许您在内核初始化后保留大型内存页面,但在大多数用户空间服务启动前。虽然这种方法不是作为内核命令行配置早期的,但可以确保应用程序在系统操作期间可以访问所需的巨页。

先决条件

  • 在您的系统中必须具有 root 权限。

流程

  1. /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
    Copy to Clipboard Toggle word wrap
  2. /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>
    Copy to Clipboard Toggle word wrap

    <number_of_pages > 替换为您要保留的 1GB 页面数,将 <node> 替换为您要保留的节点的名称。 例如:要在 node0 上保留两个 1 GB 页面,在 node1 上保留 1GB 页面,将 &lt ;number_of_pages& gt ; 替换为 node01 代表 node1

  3. 创建可执行脚本:

    # chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh
    Copy to Clipboard Toggle word wrap
  4. 启用早期引导保留:

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat