如何避免来自 mongodb 的 transparent_hugepage/defrag 警告?
How to avoid transparent_hugepage/defrag warning from mongodb?
我从 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
添加到 /etc/default/grub
中的 GRUB_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
我到底该如何避免警告?
打开/etc/default/grub
sudo vi /etc/default/grub
更新
GRUB_CMDLINE_LINUX_DEFAULT="" 到 GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"
- 保存文件
:wq(在 vi 中)
运行 更新 grub
sudo update-grub
重启机器
更新:如果您使用的是虚拟主机提供商,这将有效 IFF 支持 grub 引导。 DigitalOcean 不支持 grub 引导。
Official MongoDB documentation gives several solutions for this issue. You can also try this solution,对我有用:
注意:尝试官方文档指令如果MongoDB版本大于3.0
打开 /etc/init.d/mongod
文件。
(如果没有这样的文件,您可以检查 /etc/init.d/mongod
、/etc/init/mongod.conf
文件 - 来源:以下评论)
在 chown $DAEMONUSER /var/run/mongodb.pid
之后和 end script
之前添加以下行。
- 重新启动
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
就是这样!
MongoDB 已经更新了他们现在使用 init.d 脚本的建议:
http://docs.mongodb.org/master/tutorial/transparent-huge-pages/
已验证是否在不考虑启用的情况下检查碎片整理:
$ 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设置。
对于 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
) 并完成。
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"
我从 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
添加到 /etc/default/grub
中的 GRUB_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
我到底该如何避免警告?
打开/etc/default/grub
sudo vi /etc/default/grub
更新
GRUB_CMDLINE_LINUX_DEFAULT="" 到 GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"- 保存文件
:wq(在 vi 中) 运行 更新 grub
sudo update-grub
重启机器
更新:如果您使用的是虚拟主机提供商,这将有效 IFF 支持 grub 引导。 DigitalOcean 不支持 grub 引导。
Official MongoDB documentation gives several solutions for this issue. You can also try this solution,对我有用:
注意:尝试官方文档指令如果MongoDB版本大于3.0
打开
/etc/init.d/mongod
文件。
(如果没有这样的文件,您可以检查/etc/init.d/mongod
、/etc/init/mongod.conf
文件 - 来源:以下评论)在
chown $DAEMONUSER /var/run/mongodb.pid
之后和end script
之前添加以下行。- 重新启动
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
就是这样!
MongoDB 已经更新了他们现在使用 init.d 脚本的建议: http://docs.mongodb.org/master/tutorial/transparent-huge-pages/
已验证是否在不考虑启用的情况下检查碎片整理:
$ 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设置。
对于 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
) 并完成。
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"