「/ 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 never > /sys/kernel/mm/transparent_hugepage/defrag

/sys/kernel/mm/transparent_hugepage/enabled永久に変更するにはどうすればよいですか?


1
以下に適切な回答があるかもしれませんが、IMOではMongoDBの公式ドキュメントを参照する必要があります。docs.mongodb.org
tutorial

回答:


70

あなたはできる

  1. sysfsutilsパッケージをインストールします。

    sudo apt install sysfsutils
    
  2. そして、その設定を持つ行を以下に追加します/etc/sysfs.conf

    kernel/mm/transparent_hugepage/enabled = never
    

これは、カスタムの起動スクリプトに依存する代わりに、すべてのsysfs構成を1か所に保持するため、最もクリーンなソリューションです。スクリプトと条件式に関する他の答えは、カーネルがその設定を公開するパスがわからない場合、つまり、影響を受けるマシンで実行されているカーネルバージョンの大まかな考えさえない場合に適しています。


4
これは、AWS EC2インスタンスのUbuntu 14.04では何もしませんでした。sysfs.confについてはあまり知りませんが、Ubuntuがサポ​​ートする構成のようですが、ファイルは以前システムに存在していなかったため、追加して再起動してもmongoの出力警告はまったく変更されませんでした。また、以下のclayzermk1のアドバイスを試してみましたが、「デフラグ」警告が表示されたままです。公式のmongo docs initスクリプトは、両方の警告を削除しました。
ニーク

の出力はcat /sys/kernel/mm/transparent_hugepage/enabled何ですか?まったく存在しますか?sysfs.conf通常、起動時に評価されます/etc/init.d/sysutils。有効になっていますか?起動すると/etc/init.d/sysutils startどうなりますか?
デビッドフォースター

3
私もsysfs.confファイルとを持っていません/etc/init.d/sysutils。ubuntu 16.04
HEX 16年

1
@unhammer:いいえ、2つのスコープは異なります。sysctlカーネルパラメーターでも実現できる設定用です。sysfs.confはのエントリ用/sysです。
デビッドフォースター

1
@navossoc:新しい質問やフォローアップの質問がある場合は、新しい質問を開いてください。コメントセクションは、新しい質問や詳細なディスカッションには適していません。私の注意を引くために、コメント付きの通知を送ってください。ありがとう。
デビッドフォースター

25

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

「推奨」の方法は、GRUB構成を再構築するために編集/etc/default/grubして追加transparent_hugepage=neverしてGRUB_CMDLINE_LINUX_DEFAULTから実行update-grubすることです。

次の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エントリを上書きします。偶然AWSで実行している場合は、代わりにを編集する必要があります。/etc/default/grub/etc/default/grub.d/*/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アプリケーションサーバーでこれを試しましたが、うまくいきませんでした。それでも同じ警告メッセージが表示されます。
怖い男

EC2に関するパートをありがとうございます。50-cloudimg-settings.cfg
Martin Konecny

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

ファイルをsystemdにロードするには:

systemctl daemon-reload

MongoDBの起動時の依存関係としてファイルをアクティブ化するには

systemctl enable mongodb-hugepage-fix

変更をすぐにアクティブにする場合(次のブートの前)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

このソリューションは、systemdではなくUpstart initソリューションを使用するUbuntu 14.04に適していません


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.localrc.localはシステム起動の最後に実行されるため、これは良い考えではありません。そのため、mongodbサービスは引き続きデフォルト設定を使用します。
風水

2
/ etc / default / grubファイルを編集して、行「GRUB_CMDLINE_LINUX_DEFAULT = "transparent_hugepage = never」を変更し、update-grubコマンドを実行してからサーバーを再起動します
-PKumar

2
おかげで、うまくいきました。しかし、変更する同様の方法はあり/sys/kernel/mm/transparent_hugepage/defragますか?再起動すると、mongo shellは「**警告:/ sys / kernel / mm / transparent_hugepage / defrag is 'always'」と表示します。
風水

@FengYuこのページを試してくださいdocs.mongodb.org/manual/tutorial/transparent-huge-pages
PKumar

0

GRUBはアップグレード後に変更され、rc.localはmongoの開始後にのみ実行されるため、rc.localの最後に次のようにサービスmongo restartを追加する必要があります。

テスト-f / sys / kernel / mm / transparent_hugepage / enabled; それから
  echo never> / sys / kernel / mm / transparent_hugepage / enabled
fi

テスト-f / sys / kernel / mm / transparent_hugepage / defrag; それから
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
fi

待機1 && servie mongod restart

または、誰かが上記の行をUbuntu 14.04のinitスクリプトに追加できましたか?


0

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

sysfsutils/ を使用してみましたsysfs.confが、高速(または低速のマシン)でサービスを開始するときにタイミングの問題が発生しました。時々、monfsは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」initシステムを使用しますが、Ubuntu 16.04はsystemd initシステムに基づいています。
マークストースバーグ

0

警告ログを少し読んだ後、これら2行を/etc/sysfs.confyvoiláに追加しました。

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

これらの変更を適用した後、マシンを再起動します。


それにはまだsysfsutilsパッケージが必要です(私の答えをご覧ください)。
デビッドフォースター

確かにそれが必要です
-Ulv3r
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.