如何修改“ / sys / kernel / mm / transparent_hugepage / enabled”


50

我使用mongodb 3.0,发现警告:

MongoDB shell version: 3.0.0
connecting to: test
Server has startup warnings: 
2015-03-13T16:28:29.405+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten]

~# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

~# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

我尝试使用echo,但它不是永久的,重新启动后将被重置。

echo never > /sys/kernel/mm/transparent_hugepage/defrag

如何/sys/kernel/mm/transparent_hugepage/enabled永久修改?


1
下面可能会有很好的答案,但是IMO您应该看看MongoDB的官方文档:docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl 2015年

Answers:


70

您可以

  1. 安装sysfsutils软件包:

    sudo apt install sysfsutils
    
  2. 并将带有该设置的行附加到/etc/sysfs.conf

    kernel/mm/transparent_hugepage/enabled = never
    

这是最干净的解决方案,因为它将所有sysfs配置保留在一个位置,而不是依赖于自定义的启动脚本。如果您不知道内核将通过哪个路径公开该设置,即您甚至不了解受影响计算机上运行的内核版本,其他答案以及脚本和条件表达式也适用。


4
这对我在AWS EC2实例上的Ubuntu 14.04上没有任何帮助。我对sysfs.conf不太了解,但它似乎是Ubuntu支持的配置,但是该文件以前在我们的系统上不存在,添加该文件并重新启动完全没有改变mongo输出警告。在下面也尝试了clayzermk1的建议后,仍然出现“碎片整理”警告。官方的mongo docs init脚本确实删除了这两个警告。
2015年

输出是cat /sys/kernel/mm/transparent_hugepage/enabled什么?是否存在?sysfs.conf通常在引导时由评估/etc/init.d/sysutils。启用了吗?调用时会发生什么/etc/init.d/sysutils start
David Foerster,2015年

3
我也没有sysfs.conf文件和/etc/init.d/sysutils。ubuntu 16.04
HEX

1
@unhammer:不,两者有不同的范围。sysctl用于通过内核参数也可以实现的设置;sysfs.conf用于中的条目/sys
David Foerster

1
@navossoc:如果您有新问题或后续问题,请问一个新问题?评论部分不适用于新问题或扩展讨论。欢迎您向我发送评论并通知我,以引起我的注意。谢谢。
David Foerster,

25

MongoDB文档有一些建议。http://docs.mongodb.org/manual/reference/transparent-huge-pages/

“首选”方式是编辑/etc/default/grub并追加transparent_hugepage=neverGRUB_CMDLINE_LINUX_DEFAULT然后运行update-grub以重建GRUB配置。

下面的两层将做到这一点。确保验证输出!

sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub
sudo update-grub

请注意,这update-grub是的包装grub-mkconfiggrub-mkconfig会将条目/etc/default/grub与一起破坏/etc/default/grub.d/*。如果您偶然在AWS上运行,则需要进行编辑/etc/default/grub.d/50-cloudimg-settings.cfg

“替代”方法是/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

就我个人而言,我最终同时使用了“首选”和“备用”方法,因为它们并不互相排斥,并且消除了有关碎片整理的警告。

*为我在Ubuntu 14.04,MongoDB 3.0.2和AWS上工作。


我在DigitalOcean上的一键式MongoDB应用程序服务器上尝试了此操作,但它不起作用。仍然收到相同的警告消息。
scaryguy

感谢您对EC2和部分50-cloudimg-settings.cfg
马丁Konecny的

16

这是一个经过测试可在AWS EC2的Ubuntu 16.04上运行的解决方案。Ubuntu 16.04使用systemd初始化系统,该配置文件表示应在启动MongoDB之前更改这些设置。

创建一个名为的文件/etc/systemd/system/mongodb-hugepage-fix.service并添加以下内容:

[Unit]
Description="Disable Transparent Hugepage before MongoDB boots"
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
Before=mongodb.service      

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
RequiredBy=mongodb.service

要将文件加载到systemd中:

systemctl daemon-reload

将文件激活为MongoDB的启动时依赖性

systemctl enable mongodb-hugepage-fix

如果要立即激活更改(在下次启动之前)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

这个解决方案是适合的Ubuntu 14.04,它使用了Upstart INIT溶液代替systemd的。


1
systemd修复非常适合现代MongoDB安装,谢谢。
four43”,

7

将以下几行添加到/etc/rc.local中。

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
是否有关于此的配置文件?rc.local这不是一个好主意,因为rc.local将在系统启动结束时执行。因此mongodb服务仍将使用默认设置。
冯玉

2
编辑/ etc / default / grub文件并更改到行“ GRUB_CMDLINE_LINUX_DEFAULT =” transparent_hugepage = never“,然后运行update-grub命令,然后重新启动服务器
PKumar,2015年

2
谢谢,它有效。但是,是否有类似的修改方法/sys/kernel/mm/transparent_hugepage/defrag?当我重新启动时,mongo shell还会告诉我“ **警告:/ sys / kernel / mm / transparent_hugepage / defrag始终为'。”
冯玉


0

GRUB会在升级后更改,并且rc.local仅在mongo启动之后才能运行,因此也许我们应该在rc.local的末尾添加服务mongo restart

如果测试-f / sys / kernel / mm / transparent_hugepage / enabled; 然后
  回声永不> / sys / kernel / mm / transparent_hugepage / enabled
科幻

如果测试-f / sys / kernel / mm / transparent_hugepage / defrag; 然后
   回声永不> / sys / kernel / mm / transparent_hugepage / defrag
科幻

等待1 && servie mongod重新启动

还是有人成功在Ubuntu 14.04中将上述行添加到了init脚本中?


0

由于我们使用Ansible部署计算机,所以我不喜欢修改rc文件。

我尝试使用sysfsutils/,sysfs.conf但是在快速(或慢速)计算机上启动服务时遇到了计时问题。看起来有时mongod在sysfsutils之前启动了。有时它起作用,有时却没有。

由于mongod是一个新贵进程,因此我发现最干净的解决方案是添加/etc/mongo_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)并完成。


请注意,此解决方案使用“ Upstart”初始化系统,而Ubuntu 16.04基于systemd初始化系统。
Mark Stosberg '16

0

在阅读警告日志后,我在/etc/sysfs.confyvoilá中添加了这两行

kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never

应用这些更改后,重新启动计算机。


那仍然需要sysfsutils包装(见我的答案)。
David Foerster,

肯定是需要的
Ulv3r
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.