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

问题描述 投票:0回答:7

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

我到底怎样才能避免这个警告?

linux mongodb linux-kernel
7个回答
163
投票

MongoDB官方文档针对这个问题给出了几种解决方案。您也可以尝试这个解决方案,它对我有用:

注意:尝试官方文档指令如果 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. 重新启动
    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

就是这样!


26
投票

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


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
) 并完成。


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. 重启机器

更新:如果您使用虚拟主机提供商,则这将在支持 Grub 引导的情况下工作。 DigitalOcean 不支持 grub 启动。


6
投票

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

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

因此,修复这个bug的方法是首先查看transparent_hugepage/enabled,如果从来没有,就不用费心去查看不相关的transparent_hugepage/defrag设置了。

来源


5
投票

使用 systemd 的 Ubuntu 16.04:

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"

0
投票

systemd tmpfiles.d
/etc/tmpfiles.d/transparent_hugepage.conf

w /sys/kernel/mm/transparent_hugepage/enabled - - - - never
w /sys/kernel/mm/transparent_hugepage/defrag - - - - never
© www.soinside.com 2019 - 2024. All rights reserved.