禁用透明大页面

Ram*_*esh 70 linux kernel sysctl

我们正在RAID机器中安装 SAP HANA 。作为安装步骤的一部分,提到,

 To disable the usage of transparent hugepages set the kernel settings 
 at runtime with echo never > /sys/kernel/mm/transparent_hugepage/enabled 
Run Code Online (Sandbox Code Playgroud)

因此,如果我想让它成为永久更改,而不是运行时,我应该在/proc/vmstat文件中添加上面的行吗?

slm*_*slm 86

要使诸如此类的选项永久化,您通常会将它们添加到文件/etc/sysctl.conf. 您可以使用以下命令查看可用选项的完整列表:

$ sysctl -a
Run Code Online (Sandbox Code Playgroud)

例子

$ 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
Run Code Online (Sandbox Code Playgroud)

您可以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
Run Code Online (Sandbox Code Playgroud)

它不在吗?

但是查看输出我没有看到transparent_hugepage。谷歌搜索我确实遇到了这个 Oracle 页面,它讨论了这个主题。该页面的标题为:在 Linux (x86-64) 上为 Oracle 配置 HugePages

特别是在那个页面上,他们提到了如何禁用大页面功能

摘抄

禁用透明 HugePages 的首选方法是将“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
Run Code Online (Sandbox Code Playgroud)

必须重新启动服务器才能使其生效。

或者,您可以将命令添加到您的/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
Run Code Online (Sandbox Code Playgroud)

我想我会选择第二个选项,因为当您从一个内核升级到下一个内核时,第一个选项将面临未设置的风险。

您可以在重新启动后确认它与以下命令一起工作:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
Run Code Online (Sandbox Code Playgroud)

  • 在大多数发行版上,您可以通过将 transparent_hugepage=never 添加到 /etc/default/grub 中的 GRUB_CMDLINE_LINUX_DEFAULT 选项,使第一个选项在内核更新后继续存在。 (9认同)
  • 不要混淆大页面和透明大页面。后者会导致许多问题,主要是 CPU 使用率高,同时不断尝试对内存进行碎片整理并将普通 4kB 页面转换为巨大的 2MB 页面。 (5认同)
  • 对于 EC2 上的更新,cloudimg 添加了文件 /etc/default/grub.d/50-cloudimg-settings.cfg,它覆盖了 /etc/default/grub 中的设置,添加了一个文件 /etc/default/grub.d/ 99-transparent-hugepage.cfg 的内容为 GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage=never" 将解决这个问题。 (4认同)
  • 如果 ``cat /sys/kernel/mm/transparent_hugepage/enabled`` 的输出是 ``[always] madvise never``,则状态为 ``always`` 或已启用(注意 ``[ ]`` 括号括起来 ``总是``) (3认同)
  • @Rwky - 根据您的建议进行调整时 - 我会强调保存文件后的下一步操作是执行 `sudo update-grub` 以获得“一成不变”的新设置。+1 用于指向 grub 文件行。 (3认同)

ub3*_*t4r 13

我只是想补充这个问题,因为我试图在 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
Run Code Online (Sandbox Code Playgroud)

  • 对于 EC2 ubuntu 实例,我必须修改 `/etc/default/grub.d/50-cloudimg-settings.cfg` 文件而不是 `/etc/default/grub` 以使其工作。 (4认同)

小智 7

这是一个使用 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",
}
Run Code Online (Sandbox Code Playgroud)


小智 7

以上所有内容在 EC2 Ubuntu 16.04 上对我都不起作用,但这样做了:

sudo apt install hugepages
sudo hugeadm --thp-never
Run Code Online (Sandbox Code Playgroud)


nel*_*aro 7

感谢githubPyYoshi
我找到了这个 systemd 的例子

创建文件

sudo vim /etc/systemd/system/disable-transparent-huge-pages.service
Run Code Online (Sandbox Code Playgroud)

将其放入服务文件中

[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
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)

然后启用该服务

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
Run Code Online (Sandbox Code Playgroud)