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

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

我使用 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

你可以

  1. 安装sysfsutils包:

    sudo apt install sysfsutils
    
  2. 并将该设置附加到以下行/etc/sysfs.conf

    kernel/mm/transparent_hugepage/enabled = never
    

这是最干净的解决方案,因为它将所有 sysfs 配置保存在一个地方,而不是依赖自定义启动脚本。如果您不知道内核将通过哪条路径公开该设置,即如果您对受影响机器上运行的内核版本没有大致了解,则其他答案(包含脚本和条件表达式)是合适的。

答案2

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

“首选”方式是编辑/etc/default/grub并附加transparent_hugepage=never,然后GRUB_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。

答案3

这是一个经过测试可以在 AWS EC2 上的 Ubuntu 16.04 上运行的解决方案。Ubuntu 16.04 使用 systemd init 系统,并且此配置文件表示应在 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。

答案4

由于我们使用 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) 即可完成。

相关内容