为什么mongodb会抱怨transparent_hugepage?

mig*_*ile 6 linux virtual-machine mongodb

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

** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always.'
**        We suggest setting it to 'never'
Run Code Online (Sandbox Code Playgroud)

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

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

mig*_*ile 18

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

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

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

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

$ sudo nano /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

在"退出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
Run Code Online (Sandbox Code Playgroud)

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

ls /sys/kernel/mm/*transparent_hugepage*/enabled
cat /sys/kernel/mm/*transparent_hugepage*/enabled
Run Code Online (Sandbox Code Playgroud)

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

$ sudo su
# source /etc/rc.local
# service mongod restart
# exit
Run Code Online (Sandbox Code Playgroud)

正确应用上面所做的更改