问题描述
我使用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配置保存在一个位置,而不是依赖于自定义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-grub
是grub-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
这将在您重新启动服务器时运行。