为什么mongodb会抱怨transparent_hugepage?

时间:2015-04-04 01:07:30

标签: linux mongodb virtual-machine

有几个问题已经在询问如何修复mongodb警告:

** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always.'
**        We suggest setting it to 'never'

但我想知道是否应该修复它。我在Google云上运行的Ubuntu VM上收到MongoDB 3.0.1的警告。我应该相信MongoDB“永远不会更好”吗?或者,我应该相信Google / Ubuntu,他们将其设置为“始终”是有充分理由的吗?我想有一些权衡需要考虑,不知道我要交易什么来保留或修复它。

询问如何修复它很好,但询问是否修复它似乎更明智。

4 个答案:

答案 0 :(得分:18)

编辑:自从我写这个答案以来,Mongodb已经解决了这个问题。他们的建议是https://docs.mongodb.com/master/tutorial/transparent-huge-pages/,可能应该是你的首选解决方案。我的原始答案仍然有效,但我现在认为这是一个正式的解决方案。

原始答案:根据MongoDB文档http://docs.mongodb.org/manual/reference/transparent-huge-pages/和支持https://jira.mongodb.org/browse/DOCS-2131,transparent_hugepage(THP)旨在创建更少的大内存块而不是许多小内存块具有大量内存的系统中的内存块。如果您的软件需要大量连续的内存访问,这非常有用。但是,对于MongoDB,无论可用内存如何,它都需要大量更小的内存访问,因此在禁用THP时性能会更好。

这让我觉得无论哪种方式都可行,但是你可以通过关闭THP获得更好的mongo(或任何数据库)性能,从而为你提供更小的内存。如果你没有太多记忆,无论你跑什么,THP都应该关闭。

上面的链接概述了几种方法。最普遍适用的似乎是编辑rc.local。

$ sudo nano /etc/rc.local

在“退出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
exit 0

注意:基于redhat的系统可能使用“redhat_transparent_hugepage”而不是“transparent_hugepage”,可以通过以下方式检查:

ls /sys/kernel/mm/*transparent_hugepage*/enabled
cat /sys/kernel/mm/*transparent_hugepage*/enabled

要应用更改,请重新启动(将运行rc.local)或:

$ sudo su
# source /etc/rc.local
# service mongod restart
# exit

正确应用上面所做的更改

答案 1 :(得分:3)

对于使用upstart脚本的Ubuntu:

由于我们使用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)并完成。

答案 2 :(得分:2)

在Ubuntu中我使用了选项' Init Script'本文件:http://docs.mongodb.org/manual/tutorial/transparent-huge-pages/

答案 3 :(得分:1)

在运行Ubuntu 14.04的Amazon ec2实例上,这些都不适用于我,甚至不是MongoDB推荐的init.d脚本。我必须先使用list comprehensions工具,先通过apt-get安装,然后运行sudo hugeadm --thp-never,这个hugeadm会将我指向hugeadm。我还在试图弄清楚如何禁用transparent_hugepage碎片整理。 hugeadm似乎没有一种简单的方法可以做到这一点。

相关问题