如何修改“/ 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配置保存在一个位置,而不是依赖于自定义启动脚本。 如果您不知道内核将通过哪条路径公开该设置,那么使用脚本和条件表达式的其他答案是合适的,即如果您甚至不了解在受影响的计算机上运行的内核版本。

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

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

以下两个class轮就是这样做的。 确保validation输出!

 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.d/*条目破坏/etc/default/grub条目。 如果您正在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 

就个人而言,我最终做了“首选”和“替代”方法,因为它们不是互斥的,它消除了有关碎片整理的警告。

*在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的启动时依赖项

 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 

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

由于我们使用Ansible部署机器,我不喜欢修改rc文件。

我尝试使用sysfsutils / sysfs.conf但在快速(或慢速机器)上启动服务时遇到了时间问题。 看起来有时mongod在sysfsutils之前启动了。 有时它有效,有时则没有。

由于mongod是一个暴发的过程,我发现最干净的解决方案是使用以下内容添加文件/etc/mongo_vm_settings.conf

 # Ubuntu upstart file at /etc/init/mongod_vm_settings.conf # # This file will set the correct kernel VM settings for MongoDB # This file is maintained in Ansible start on (starting mongod) script echo "never" > /sys/kernel/mm/transparent_hugepage/enabled echo "never" > /sys/kernel/mm/transparent_hugepage/defrag end script 

这将在mongod启动之前运行脚本。 重启mongod( sudo service mongod restart )并完成。

在警告日志中读了一下后,我在/etc/sysfs.conf添加了这两行yvoilá

 kernel/mm/transparent_hugepage/enabled = never kernel/mm/transparent_hugepage/defrag = never 

应用这些更改后重新启动计算机。

GRUB将在升级后更改,并且rc.local将仅在mongo启动后运行,所以也许我们应该在rc.local的末尾添加service mongo restart

 如果测试-f / sys / kernel / mm / transparent_hugepage / enabled; 然后
   echo never> / sys / kernel / mm / transparent_hugepage / enabled
科幻

如果测试-f / sys / kernel / mm / transparent_hugepage / defrag; 然后
    echo never> / sys / kernel / mm / transparent_hugepage / defrag
科幻

等待1 && servie mongod重新启动

或者有人成功地将上面的行添加到Ubuntu 14.04中的init脚本中?