如何避免来自mongodb的transparent_hugepage / defrag警告?

时间:2015-03-07 05:09:54

标签: linux mongodb linux-kernel

我收到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]

我通过将transparent_hugepage=never添加到GRUB_CMDLINE_LINUX_DEFAULT中的/etc/default/grub并添加

来实现这一目的
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

/etc/rc.local

我怎么能避免警告?

6 个答案:

答案 0 :(得分:161)

Official MongoDB documentation为此问题提供了多种解决方案。您也可以尝试this solution,这对我有用:

注意:如果MongoDB版本大于3.0,请尝试使用官方文档指令

  1. 打开/etc/init.d/mongod个文件。
    (如果没有此类文件,您可以查看/etc/init.d/mongod/etc/init/mongod.conf个文件 - 信用:以下评论)

  2. chown $DAEMONUSER /var/run/mongodb.pid之后和end script之前立即添加以下行。

  3. 重新启动mongodservice mongod restart)。
  4. 以下是要添加到/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
    

    就是这样!

答案 1 :(得分:24)

MongoDB已经更新了他们现在使用 init.d 脚本的建议: http://docs.mongodb.org/master/tutorial/transparent-huge-pages/

答案 2 :(得分:10)

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

答案 3 :(得分:8)

  1. 打开/ etc / default / grub

    sudo vi / etc / default / grub

  2. 更新
    GRUB_CMDLINE_LINUX_DEFAULT =""至GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never"

  3. 保存文件
    :wq(在vi中)
  4. 运行update-grub

    sudo update-grub

  5. 重新启动计算机

  6. 更新:如果您使用的是虚拟主机提供商,则可以使用IFF grub引导。 DigitalOcean不支持grub启动。

答案 4 :(得分:5)

验证是否检查了碎片整理而不考虑启用:

$ 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

答案 5 :(得分:1)

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"