如何永久启用和分配显式大页面(explicit hugepages)?

一种是通过指定“hugepages=N”参数在内核引导命令行上分配持久大页面,其中“N”=请求的大页面数量。
这是分配大页面的最可靠方法,因为内存尚未碎片化。

将“hugepages=N”添加到“/etc/sysconfig/grub”到GRUB_CMDLINE_LINUX,如下所示

GRUB_CMDLINE_LINUX="novga console=ttyS0,115200 panic=1 numa=off elevator=cfq rd.md.uuid=c0dd5b9a:ff7440ae:3bfc1616:defc0291 rd.lvm.lv=os/root rd.md.uuid=05e8d321:d3191ad9:48a0aba2:efdd0b6c rd.md.uuid=2826bc19:9266a29e:e0989473:987348ad rhgb quiet console=tty0 hugepages=2048"

重建initramfs

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-693.21.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.21.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-fae7c244c3134771a10cc7c3ace3edcb
Found initrd image: /boot/initramfs-0-rescue-fae7c244c3134771a10cc7c3ace3edcb.img
done

重新启动节点以使更改生效
重新启动后验证更改

# sysctl -a | grep hugepages
vm.nr_hugepages = 2048

我们还可以使用 sysctl.conf 保留大页面

# echo "vm.nr_hugepages = 2048" >> /etc/sysctl.conf

刷新值

# sysctl -p

重新启动服务器以使更改生效。

如何永久禁用显式透明大页面?

要永久禁用显式大页面,请在“/etc/sysctl.conf”中添加以下条目

# grep -i nr_hugepages /etc/sysctl.conf
vm.nr_hugepages=0

刷新值

# sysctl -p

下面的命令将显示更新的值

# sysctl -a | grep nr_hugepages
vm.nr_hugepages = 0

注意:需要重新启动才能激活更改。

如何使用tuned profile文件永久禁用透明大页面(Transparent Hugepages)?

我们可以使用现有的调整配置文件,也可以创建新的配置文件。

使用现有的优化配置文件。
我的节点配置的是 throughput-performance 文件,您可以使用下面的命令检查加载的配置文件

# tuned-adm active
Current active profile: throughput-performance

接下来编辑我们调整的配置文件并在“[vm]”下添加以下值

# vim /usr/lib/tuned/throughput-performance/tuned.conf
[vm]
transparent_hugepage=never

接下来激活profile文件

# tuned-adm profile throughput-performance

验证更改

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

重要说明:这不需要重新启动,更改将立即激活

查看我们的教程: 如何创建新的自定义的tuned profile

有了这个,我们将创建当前运行的配置文件的自定义版本。自定义版本将仅禁用THP。

找出哪个配置文件处于活动状态,创建一个副本。
在以下示例中,我们目前使用的是 throughput-performance文件 :

# tuned-adm active
Current active profile: throughput-performance

要创建自定义配置文件,请在 /etc/tuned 目录中创建一个具有所需配置文件名称的新目录。

# mkdir /etc/tuned/myprofile-disablethp

然后为 myprofile-disablethp 创建一个新的 tuning.conf 文件,并插入新的调整信息:

# cat /etc/tuned/myprofile-disablethp/tuned.conf
[main]
include= throughput-performance
[vm]
transparent_hugepages=never

使脚本可执行

# chmod +x /etc/tuned/myprofile-disablethp/tuned.conf

启用myprofile,例如

# tuned-adm profile myprofile-disablethp

验证更改

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

重要说明:这不需要重新启动,更改将立即激活

HugePages的类型:

系统中可以有两种类型的 HugePages

  • 由 vm.nr_hugepages sysctl 参数显式分配的显式大页面例如:用作大页面的页面在内核内部保留,不能用于其他目的。
  • 由内核自动分配的透明大页面。

如何检查是否启用了 HugePages?

如果 HugePages_Total 的值大于“0”,则表示系统启用了 HugePages

# grep -i HugePages_Total /proc/meminfo
HugePages_Total:   23090

检查以下文件

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

如何在运行时禁用透明Hugepages?

运行以下命令将仅停止新 THP 的创建和使用。

在运行上述命令时创建和使用的 THP 不会被分解为常规内存页。

要完全摆脱 THP,系统应该在启动时禁用 THP 的情况下重新启动。

# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
# echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
  • “always”表示请求THP的应用程序将在分配失败时暂停,并直接回收页面和压缩内存,以便立即分配THP。
  • “defer”意味着应用程序将在后台唤醒kswapd以回收页面,并将kcompactd唤醒以压缩内存,以便在不久的将来THP可用。khugepaged有责任在以后安装THP页面。
  • “madvise”将像“always”一样输入直接回收,但仅适用于已使用madvise(MADV_HUGEPAGE)的地区。这是默认行为。
  • “never”表示根本不分配THP

默认情况下,内核尝试在读取页面错误时使用巨大的零页到匿名映射。
可以通过写入 0 来禁用巨大的零页或者通过写入 1 来启用它

echo 0 >/sys/kernel/mm/transparent_hugepage/use_zero_page
echo 1 >/sys/kernel/mm/transparent_hugepage/use_zero_page
如何在Linux中启用或者禁用透明(THP)和显式(nr_hugepages)hugepage并检查状态

什么是透明hugepage(THP)以及如何在Linux中检查每个进程的THP使用情况

如何使用 GRUB2 永久禁用透明大页面(Transparent Hugepages)?

我们可以通过向内核命令行传递参数“transparent_hugepage=always”或者“transparent_hugepage=madvise”或者“transparent_hugepage=never”来更改透明大页面支持的sysfs启动时间默认值。

要禁用THP,请在grub配置文件的内核命令行中使用“transparent_hugepage=never”。
对于我的设置,我使用GRUB2(/etc/sysconfig/grub)

GRUB_CMDLINE_LINUX="novga console=ttyS0,115200 panic=1 numa=off elevator=cfq rd.md.uuid=d265dd3d:9ee4d53a:597b8c08:8201b9af rd.lvm.lv=os/root rd.md.uuid=5398452a:ab1b8e91:4307b53b:5c3cccbd rd.md.uuid=131bc1e7:7c9087c3:03f3ad4a:7cde170c noht rhgb quiet transparent_hugepage=never"

接下来重建你的 grub 配置文件

# grub2-mkconfig -o /boot/grub2/grub.cfg

重新启动节点以使更改生效。
节点启动后,请确保加载的 grub 配置中存在新添加的条目

# grep transparent_hugepage /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-862.6.3.el7.x86_64 root=/dev/mapper/os-root ro novga console=ttyS0,115200 panic=1 numa=off elevator=cfq rd.md.uuid=d265dd3d:9ee4d53a:597b8c08:8201b9af rd.lvm.lv=os/root rd.md.uuid=5398452a:ab1b8e91:4307b53b:5c3cccbd rd.md.uuid=131bc1e7:7c9087c3:03f3ad4a:7cde170c noht biosdevname=0 net.ifnames=0 rhgb quiet transparent_hugepage=never

配置被正确加载。

如何检查 HugePages 是否被禁用?

在上述步骤中,我们禁用了 THP 以确保内核不会分配或者保留任何大页面。

如果 HugePages_Total 的值为“0”,则表示系统上禁用了 HugePages。

# grep -i HugePages_Total /proc/meminfo
HugePages_Total:       0

检查以下文件

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

这必须表明 hugepage 配置为 [never]

如何在运行时禁用显式透明大页面?

nr_hugepages 表示内核大页面池中“持久”大页面的当前数量。
当任务释放时,“persistent”大页面将返回到大页面池中。

当支持多种大页面大小时,/proc/sys/vm/nr_hugepages表示当前默认大小的预分配大页面数量。

因此,可以使用以下命令动态分配/取消分配默认大小的持久性大页面。
如果 /proc/sys/vm/nr_hugepages 文件或者 vm.nr_hugepages sysctl 参数中的值为“0”,则表示系统上禁用了 HugePages

# echo 0 > /proc/sys/vm/nr_hugepages
# cat /proc/sys/vm/nr_hugepages
0
# sysctl vm.nr_hugepages
vm.nr_hugepages = 0
日期:2020-06-02 22:16:58 来源:oir作者:oir