禁用透明大页

禁用透明大页

我们正在安装 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

相关内容