【问题标题】:How to avoid transparent_hugepage/defrag warning from mongodb?如何避免来自 mongodb 的 transparent_hugepage/defrag 警告?
【发布时间】:2015-05-08 19:35:41
【问题描述】:

我从 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]

我通过在/etc/default/grub 中添加transparent_hugepage=neverGRUB_CMDLINE_LINUX_DEFAULT 并添加

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

/etc/rc.local

究竟如何才能避免警告?

【问题讨论】:

  • 我遇到了同样的问题,但忘记重新启动所有内容,包括 mongod。我知道这可能是一个愚蠢的问题,但你是否重新启动了一切?
  • 等等...你的意思是重启mongod服务?哦...我跑了sudo service mongod restart,警告就消失了!谢谢!这很奇怪,为什么我不能重启虚拟机?
  • 不知道为什么它在重新启动时没有赶上。但是,是的,我的意思是重新启动守护进程。很高兴它正在工作。
  • 这不是解决方案。您在重新启动后看到此警告的原因是 mongo 守护程序在您的 rc.local 执行之前启动。在系统启动后重新启动守护进程解决了这个问题,但是下次当你重新启动你的虚拟机时,你会再次看到这个很好的警告。很遗憾,我无法为您提供解决方案,因为我仍在寻找它。
  • @Frederick888 即使重新启动虚拟机?重新启动服务可以暂时解决警告。有关更多详细信息,请查看此问题:jira.mongodb.org/browse/SERVER-17418

标签: linux mongodb linux-kernel


【解决方案1】:
  1. 打开 /etc/default/grub

    sudo vi /etc/default/grub

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

  3. 保存文件
    :wq (in vi)
  4. 运行更新-grub

    sudo update-grub

  5. 重启机器

更新:如果您使用的是虚拟主机提供商,这将工作,如果支持 IFF grub 引导。 DigitalOcean 不支持 grub 引导。

【讨论】:

  • 它对我不起作用...(是的,我有自己的 Linux 机器,带有 grub 引导)... :(
  • 请注意,如果您正在使用此处提到的某些解决方案,那么在同时运行“tuned”的系统上,tuned 可能会覆盖这些解决方案。请参阅此处了解更多信息:bugzilla.redhat.com/show_bug.cgi?id=1189868
【解决方案2】:

Official MongoDB documentation 为这个问题提供了几种解决方案。你也可以试试this solution,它对我有用:

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

  1. 打开/etc/init.d/mongod 文件。
    (如果没有此类文件,您可以查看/etc/init.d/mongod/etc/init/mongod.conf 文件 - 来源:以下 cmets)

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

  3. 重启mongod(service mongod restart)。

以下是要添加到/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

就是这样!

【讨论】:

  • 很抱歉没有立即接受您的回答。我评论了我添加到 rc.local 的行并尝试了您的解决方案,它也对我有用。谢谢!
  • 好吧,我没有找到 /etc/init/mongod.conf 文件,但我确实将这些行添加到 /etc/init.d/mongod 脚本文件中,就在 echo "Starting ...”行,它对我有用
  • 很棒的解决方案!适用于 Ubuntu 14.04 和 mongod 3。
  • 这项工作请为 Ubuntu 用户添加 /etc/init/mongod.conf 的备用条目。谢谢。
  • 我在 ubuntu 上使用 mongodb,我的 conf 文件是 YAML 格式。那里也有适用的替代解决方案吗?
【解决方案3】:

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

【讨论】:

  • 这是ubuntu 16.04及以上版本的正确答案
【解决方案4】:

已验证是否在不考虑启用的情况下检查碎片整理:

$ 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.

【讨论】:

  • 在 Oracle Linux 7 上工作,经过推荐的更改后碎片整理从未消失.. 终于松了一口气!这个答案需要更多的支持!!我花了 4 个小时来挖掘这个。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    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"
    

    【讨论】:

    • 在 /usr/lib/systemd/system/mongod.service 中也为 Centos 7 工作过
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2021-02-04
    • 2019-02-21
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多