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

Fen*_* Yu 54 kernel mongodb systemd sysfs 16.04

我使用 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]
Run Code Online (Sandbox Code Playgroud)
~# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

~# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
Run Code Online (Sandbox Code Playgroud)

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

echo never > /sys/kernel/mm/transparent_hugepage/defrag
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ter 75

你可以

  1. 安装sysfsutils软件包:

    sudo apt install sysfsutils
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并将具有该设置的行附加到/etc/sysfs.conf

    kernel/mm/transparent_hugepage/enabled = never
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 这对我在 AWS EC2 实例上的 Ubuntu 14.04 上没有任何作用。我对 sysfs.conf 了解不多,但它似乎是 Ubuntu 支持的配置,但该文件以前不存在于我们的系统中,添加它并重新启动根本不会改变 mongo 输出警告。还尝试了下面的 clayzermk1 的建议,仍然出现“碎片整理”警告。官方 mongo docs init 脚本确实删除了这两个警告。 (4认同)
  • 我也没有 `sysfs.conf` 文件和 `/etc/init.d/sysutils`。Ubuntu 16.04 (3认同)

cla*_*mk1 25

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
Run Code Online (Sandbox Code Playgroud)

请注意,这update-grubgrub-mkconfig. grub-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
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*erg 16

这是一个经过测试可在 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
Run Code Online (Sandbox Code Playgroud)

要将文件加载到 systemd:

systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

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

systemctl enable mongodb-hugepage-fix
Run Code Online (Sandbox Code Playgroud)

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

systemctl start mongodb-hugepage-fix
systemctl restart mongod
Run Code Online (Sandbox Code Playgroud)

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


PKu*_*mar 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
Run Code Online (Sandbox Code Playgroud)

这将在您重新启动服务器时运行。

  • 编辑 /etc/default/grub 文件并更改“GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never”行并运行 update-grub 命令,然后重新启动服务器 (2认同)
  • 谢谢,它有效。但是,有没有类似的方法来修改``/sys/kernel/mm/transparent_hugepage/defrag``?当我重新启动时,mongo shell 还告诉我“** 警告:/sys/kernel/mm/transparent_hugepage/defrag 是‘总是’。” (2认同)