我们正在安装 SAP HANA袭击机器。作为安装步骤的一部分,提到,
To disable the usage of transparent hugepages set the kernel settings
at runtime with echo never > /sys/kernel/mm/transparent_hugepage/enabled
因此,如果我想将其永久更改,而不是运行时,我应该在/proc/vmstat
文件中添加上面的行吗?
答案1
要使此类选项永久存在,您通常会将它们添加到文件中/etc/sysctl.conf
。您可以使用此命令查看可用选项的完整列表:
$ sysctl -a
例子
$ sudo sysctl -a | head -5
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 6000000
kernel.sched_latency_ns = 18000000
kernel.sched_wakeup_granularity_ns = 3000000
kernel.sched_shares_ratelimit = 750000
hugepage
您可以像这样在输出中查找:
$ sudo sysctl -a | grep hugepage
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0
不在那里吗?
然而,查看输出我没有看到transparent_hugepage
。进一步谷歌搜索后,我确实发现了这个 Oracle 页面,其中讨论了这个主题。该页面的标题是:在 Linux (x86-64) 上为 Oracle 配置大页。
特别是在该页面上,他们提到了如何禁用大页功能。
摘抄
禁用透明大页的首选方法是将“transparent_hugepage=never”添加到“/etc/grub.conf”文件中的内核引导行。
title Oracle Linux Server (2.6.39-400.24.1.el6uek.x86_64) root (hd0,0) kernel /vmlinuz-2.6.39-400.24.1.el6uek.x86_64 ro root=/dev/mapper/vg_ol6112-lv_root rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=uk LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 rd_NO_DM rd_LVM_LV=vg_ol6112/lv_swap rd_LVM_LV=vg_ol6112/lv_root rhgb quiet numa=off transparent_hugepage=never initrd /initramfs-2.6.39-400.24.1.el6uek.x86_64.img
必须重新启动服务器才能生效。
或者,您可以将该命令添加到您的/etc/rc.local
文件中。
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
我想我会选择第二个选项,因为当您从一个内核升级到下一个内核时,第一个选项将面临取消设置的风险。
您可以在重新启动后使用以下命令确认它是否有效:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
答案2
我只是想补充这个问题,因为我试图在 CentOS v6 上禁用透明大页,以便为 MariaDB 启用 TokuDB。我添加了 @slm 提到的脚本/etc/rc.local
,它禁用了透明大页。但是,由于启动脚本在 Linux 中的工作方式,/etc/rc.local
是在所有服务启动后执行的。因此,在 MariaDB 启动后,透明大页被禁用,并且 TokuDB 引擎无法初始化。禁用透明大页的唯一其他方法是添加transparent_hugepage=never
到内核参数。
我注意到@Rwky的评论You can make the first option survive kernel updates by adding transparent_hugepage=never to the GRUB_CMDLINE_LINUX_DEFAULT option in /etc/default/grub on most distributions.
,发现CentOS不支持该/etc/default/grub
文件,并且担心transparent_hugepage=never
更新时会从内核参数中消失。但不用担心,CentOS 设置为保留对 grub 中内核参数所做的任何更改,以便在更新时保留它们。
另外补充一下,修改 grub 内核参数的正确方法是使用grubby
.我创建了这个简单的脚本来添加transparent_hugepage=never
到每个内核grubby
:
#!/bin/sh
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi
for KERNEL in /boot/vmlinuz-*; do
grubby --update-kernel="$KERNEL" --args='transparent_hugepage=never'
done
答案3
这是使用 puppet 的实现:
exec { "disable_transparent_hugepage_enabled":
command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled",
unless => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/enabled 2>/dev/null",
}
exec { "disable_transparent_hugepage_defrag":
command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag",
unless => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/defrag 2>/dev/null",
}
答案4
谢谢github&皮耀西
我找到了这个 systemd 的例子
创建文件
sudo vim /etc/systemd/system/disable-transparent-huge-pages.service
将其放入服务文件中
[Unit]
Description=Disable Transparent Huge Pages
[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"
[Install]
WantedBy=multi-user.target
对于 debian/ubuntu 用户
[Unit]
Description=Disable Transparent Huge Pages
[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"
[Install]
WantedBy=multi-user.target
然后启用该服务
systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages