12.3.2. 使用 systemd 服务单元配置 HugeTLB
要在用户空间引导过程中配置 Huge Translation Lookaside Buffer (HugeTLB)页面,请使用 systemd 服务单元。这会在内核初始化后保留内存,但在大多数服务启动后,请确保应用程序可以访问所需的页面。
先决条件
- 在您的系统中必须具有 root 权限。
流程
在
/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在
/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> 替换为您要保留的节点名称。例如:要在node0上保留两个 1 GB 页面,在node1上保留 1GB 页面,将 <number_of_pages>替换为node0,1代表node1。创建可执行脚本:
# chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh启用早期引导保留:
# systemctl enable hugetlb-gigantic-pages.service注意-
您可以在运行时尝试保留更多 1 GB 页面,方法是写入
nr_hugepages属性。但是,为了避免因为内存碎片导致失败,在引导过程中在早期保留 1 GB 页面。 - 保留静态巨页可以有效地减少系统可用的内存量,并阻止它使用内存容量。虽然正确大小的保留巨页池对使用它的应用程序有用,但保留巨页的过度或未使用的池最终会降低整体系统性能。当设置保留的巨页池时,请确定系统可以正确地使用其完整的内存容量。
-
您可以在运行时尝试保留更多 1 GB 页面,方法是写入