如何避免来自 mongodb 的 transparent_hugepage/defrag 警告?
Posted
技术标签:
【中文标题】如何避免来自 mongodb 的 transparent_hugepage/defrag 警告?【英文标题】:How to avoid transparent_hugepage/defrag warning from mongodb? 【发布时间】:2015-05-08 19:35:41 【问题描述】:我从 mongodb 收到以下关于 THP 的警告
2015-03-06T21:01:15.526-0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-06T21:01:15.526-0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
但我确实设法手动关闭了 THP
frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
我通过在/etc/default/grub
中添加transparent_hugepage=never
到GRUB_CMDLINE_LINUX_DEFAULT
并添加
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
致/etc/rc.local
究竟如何才能避免警告?
【问题讨论】:
我遇到了同样的问题,但忘记重新启动所有内容,包括 mongod。我知道这可能是一个愚蠢的问题,但你是否重新启动了一切? 等等...你的意思是重启mongod服务?哦...我跑了sudo service mongod restart
,警告就消失了!谢谢!这很奇怪,为什么我不能重启虚拟机?
不知道为什么它在重新启动时没有赶上。但是,是的,我的意思是重新启动守护进程。很高兴它正在工作。
这不是解决方案。您在重新启动后看到此警告的原因是 mongo 守护程序在您的 rc.local 执行之前启动。在系统启动后重新启动守护进程解决了这个问题,但是下次当你重新启动你的虚拟机时,你会再次看到这个很好的警告。很遗憾,我无法为您提供解决方案,因为我仍在寻找它。
@Frederick888 即使重新启动虚拟机?重新启动服务可以暂时解决警告。有关更多详细信息,请查看此问题:jira.mongodb.org/browse/SERVER-17418
【参考方案1】:
打开 /etc/default/grub
sudo vi /etc/default/grub
更新 GRUB_CMDLINE_LINUX_DEFAULT="" 到 GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"
保存文件 :wq (in vi)运行更新-grub
sudo update-grub
重启机器
更新:如果您使用的是虚拟主机提供商,这将工作,如果支持 IFF grub 引导。 DigitalOcean 不支持 grub 引导。
【讨论】:
它对我不起作用...(是的,我有自己的 Linux 机器,带有 grub 引导)... :( 请注意,如果您正在使用此处提到的某些解决方案,那么在同时运行“tuned”的系统上,tuned 可能会覆盖这些解决方案。请参阅此处了解更多信息:bugzilla.redhat.com/show_bug.cgi?id=1189868【参考方案2】:Official MongoDB documentation 为这个问题提供了几种解决方案。你也可以试试this solution,它对我有用:
注意:如果 MongoDB 版本大于 3.0,请尝试官方文档指令
打开/etc/init.d/mongod
文件。
(如果没有此类文件,您可以查看/etc/init.d/mongod
、/etc/init/mongod.conf
文件 - 来源:以下 cmets)
在chown $DAEMONUSER /var/run/mongodb.pid
之后和end script
之前添加以下行。
mongod
(service mongod restart
)。
以下是要添加到/etc/init.d/mongod
的行:
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
就是这样!
【讨论】:
很抱歉没有立即接受您的回答。我评论了我添加到 rc.local 的行并尝试了您的解决方案,它也对我有用。谢谢! 好吧,我没有找到 /etc/init/mongod.conf 文件,但我确实将这些行添加到 /etc/init.d/mongod 脚本文件中,就在 echo "Starting ...”行,它对我有用 很棒的解决方案!适用于 Ubuntu 14.04 和 mongod 3。 这项工作请为 Ubuntu 用户添加 /etc/init/mongod.conf 的备用条目。谢谢。 我在 ubuntu 上使用 mongodb,我的 conf 文件是 YAML 格式。那里也有适用的替代解决方案吗?【参考方案3】:MongoDB 已经更新了他们现在使用 init.d 脚本的建议: http://docs.mongodb.org/master/tutorial/transparent-huge-pages/
【讨论】:
这是ubuntu 16.04及以上版本的正确答案【参考方案4】:已验证是否在不考虑启用的情况下检查碎片整理:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
$ cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
$ service mongod start
... (in log) WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'
$ echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
$ service mongod stop
$ service mongod start
... (no warning in log)
因此,此错误的修复是首先查看 transparent_hugepage/enabled,如果从来没有,请不要费心查看不相关的 transparent_hugepage/defrag 设置。
Source.
【讨论】:
在 Oracle Linux 7 上工作,经过推荐的更改后碎片整理从未消失.. 终于松了一口气!这个答案需要更多的支持!!我花了 4 个小时来挖掘这个。【参考方案5】:对于使用 upstart 的 Ubuntu 14.04:
由于我们使用 Ansible 部署机器,我不喜欢修改 rc 文件或 GRUB 配置。
我尝试使用sysfsutils
/ sysfs.conf
,但在快速(或慢速机器)上启动服务时遇到了时间问题。看起来有时 mongod 是在 sysfsutils 之前启动的。有时有效,有时无效。
由于 mongod 是一个新贵进程,我发现最干净的解决方案是添加具有以下内容的文件 /etc/init/mongod_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
) 并完成。
【讨论】:
【参考方案6】:Ubuntu 16.04 使用 systemd:
systemctl edit mongod
粘贴以下内容:
[Service]
PermissionsStartOnly=true
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
【讨论】:
在 /usr/lib/systemd/system/mongod.service 中也为 Centos 7 工作过以上是关于如何避免来自 mongodb 的 transparent_hugepage/defrag 警告?的主要内容,如果未能解决你的问题,请参考以下文章
如何在带有来自 std::string 的 unordered_map 的字符串文字上使用 is_transparent 功能?