当前位置: 首页>>技术问答>>正文


如何修改“/sys/kernel/mm/transparent_hugepage/enabled”

, , , , ,

问题描述

我使用mongodb 3.0,我发现了一个警告:

MongoDB shell version: 3.0.0
connecting to: test
Server has startup warnings: 
2015-03-13T16:28:29.405+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten]

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

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

我尝试使用echo,但它不是永久性的,重新启动后它将被重置。

echo never > /sys/kernel/mm/transparent_hugepage/defrag

如何永久修改/sys/kernel/mm/transparent_hugepage/enabled

最佳解决方法

您可以

  1. 安装sysfsutils包:

    sudo apt install sysfsutils
    
  2. 并将具有该设置的行附加到/etc/sysfs.conf

    kernel/mm/transparent_hugepage/enabled = never
    

这是最干净的解决方案,因为它将所有sysfs配置保存在一个位置,而不是依赖于自定义start-up脚本。如果您不知道内核将通过哪条路径公开该设置,那么使用脚本和条件表达式的其他答案是合适的。即如果你甚至不知道在受影响的机器上运行的内核版本。

次佳解决方法

MongoDB文档有一些建议。 http://docs.mongodb.org/manual/reference/transparent-huge-pages/

“preferred”方式是编辑/etc/default/grub并将transparent_hugepage=never附加到GRUB_CMDLINE_LINUX_DEFAULT,然后运行update-grub以重建GRUB配置。

以下two-liner就是这样做的。确保验证输出!

sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub
sudo update-grub

请注意,update-grubgrub-mkconfig的包装。 grub-mkconfig/etc/default/grub中的/etc/default/grub.d/*/etc/default/grub.d/*中的条目相同。如果您在AWS上运行,则需要编辑/etc/default/grub.d/50-cloudimg-settings.cfg

“alternate”方法是编辑/etc/rc.local并在exit 0之前添加以下内容:

if test -f /sys/kernel/mm/transparent_hugepage/khugepaged/defrag; then
  echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

就个人而言,我最终同时执行”preferred”和”alternate”方法,因为它们不是互斥的,它消除了有关碎片整理的警告。

*在Ubuntu 14.04,MongoDB 3.0.2和AWS上为我工作。

第三种解决方法

这是一个经过测试可在AWS EC2上运行Ubuntu 16.04的解决方案。 Ubuntu 16.04使用systemd init系统,这个配置文件表示在MongoDB启动之前应该更改这些设置。

创建名为/etc/systemd/system/mongodb-hugepage-fix.service的文件并添加以下内容:

[Unit]
Description="Disable Transparent Hugepage before MongoDB boots"
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
Before=mongodb.service      

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
RequiredBy=mongodb.service

要将文件加载到systemd:

systemctl daemon-reload

将文件激活为MongoDB的boot-time依赖项

systemctl enable mongodb-hugepage-fix

如果要立即激活更改(在下次引导之前)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

此解决方案不适用于Ubuntu 14.04,它使用Upstart init解决方案而不是systemd。

第四种方法

在/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

这将在您重新启动服务器时运行。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2054.html,未经允许,请勿转载。