2015-04-04 109 views
3

的几个问题已经问如何解决MongoDB的警告:为什么mongodb抱怨transparent_hugepage?

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

但我不知道是否应该固定。我在谷歌云上运行的Ubuntu VM上从MongoDB 3.0.1中得到这个警告。我应该相信MongoDB“永不”更好吗?或者我应该相信谷歌/ Ubuntu,他们把它设置为“总是”有一个很好的理由?我想有一些权衡需要考虑,不知道我会保留或修复它。

问问如何解决这个问题很好,但问是否修复它似乎更聪明。

+1

查看这个的方法是Google/Ubuntu将它设置为'always',因为这在一般情况下是很好的,而且MongoDB建议在特殊情况下'永远'更好(特殊情况是运行MongoDB) – nos 2015-04-04 01:34:25

回答

17

编辑:自从我写这个答案以来,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_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 

正确应用上面

+0

谢谢!做完这些并重新启动后,我仍然收到错误信息。我需要重新启动mongod服务才能正常工作。 – JoeRocc 2016-05-08 09:12:28

+0

在Ubuntu 14.04上尝试了很多东西,而这最终奏效了。谢谢! – 2016-06-04 16:32:04

+0

也在Ubuntu 16.04上工作。 – davisec52 2017-01-12 20:55:40

1

这些都不适用于运行Ubuntu 14.04的Amazon EC2实例,甚至不是由MongoDB推荐的init.d脚本。我不得不使用hugeadm工具,首先通过apt-get安装,然后运行sudo hugeadm --thp-never,这个post指向我hugeadm。我仍然试图找出如何禁用transparent_hugepage碎片整理。 hugeadm似乎没有一个简单的方法来做到这一点。

3

对于使用Ubuntu的暴发户脚本:

由于我们与Ansible部署的机器我不喜欢修改RC文件或GRUB CONFIGS。

我尝试使用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)并完成。

相关问题