如何修改“/ 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
?
您可以
-
安装
sysfsutils
包:sudo apt install sysfsutils
-
并在
/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-grub
是grub-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脚本中?