如何永久启用和分配显式大页面(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
什么是透明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