「/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 構成を 1 か所に保持するためです。スクリプトと条件式を使用した他の回答は、カーネルがその設定を公開するパスがわからない場合、つまり、影響を受けるマシンで実行されているカーネルのバージョンが大まかにわからない場合に適しています。

答え2

MongoDB のドキュメントにはいくつかの提案があります。http://docs.mongodb.org/manual/reference/transparent-huge-pages/

「推奨される」方法は、編集し/etc/default/grubて追加しtransparent_hugepage=neverGRUB_CMDLINE_LINUX_DEFAULT実行してupdate-grubGRUB 構成を再構築することです。

次の 2 行のコードでそれが実現します。出力を必ず確認してください。

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

個人的には、「推奨」方法と「代替」方法は相互に排他的ではなく、デフラグに関する警告がなくなるため、最終的には両方を実行することにしました。

* 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

この解決策はないsystemd の代わりに Upstart init ソリューションを使用する Ubuntu 14.04 に適しています。

答え4

Ansible を使用してマシンを展開しているので、rc ファイルを変更するのは好きではありません。

sysfsutils/の使用を試みましたsysfs.confが、高速 (または低速) マシンでサービスを開始するときにタイミングの問題が発生しました。mongod が sysfsutils より前に開始されることがあったようです。うまくいくときもあれば、うまくいかないときもありました。

/etc/mongo_vm_settings.confmongod は upstart プロセスなので、最もクリーンな解決策は次の内容のファイルを追加することだとわかりました。

# 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) すれば完了です。

関連情報