为什么 mongodb 抱怨 transparent_hugepage?

Why does mongodb complain about transparent_hugepage?

关于如何修复 mongodb 警告的一些问题已经在询问:

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

但我想知道是否应该修复它。我从 MongoDB 3.0.1 在 Google 的云上的 Ubuntu VM 运行 上收到此警告。我应该相信 MongoDB 'never' 更好吗?还是我应该相信 Google/Ubuntu 他们将其设置为 'always' 是有充分理由的?我想需要权衡取舍,但不知道我会用什么来保留或修复它。

问怎么修还好,问要不要修似乎更明智

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

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

这让我觉得这两种方法都行得通,但是关闭 THP 后您会获得更好的 mongo(或任何数据库)性能,从而减少内存占用。如果你没有太多内存,那么无论你做什么,THP 都应该关闭 运行。

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

$ sudo nano /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
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

正确应用上面所做的更改

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

其中

None 在 Amazon ec2 实例 运行 Ubuntu 14.04 上为我工作,甚至 MongoDB 推荐的 init.d 脚本也不行。我不得不使用 hugeadm tool by first installing it via apt-get and then running sudo hugeadm --thp-never, this post 将我指向 hugeadm。我仍在尝试弄清楚如何禁用 transparent_hugepage 碎片整理。 hugeadm 似乎没有简单的方法来做到这一点。

Ubuntu 使用 upstart 脚本:

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