web-dev-qa-db-ja.com

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

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

50
Feng Yu

あなたはできる

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

    Sudo apt install sysfsutils
    
  2. その設定を含む行を/etc/sysfs.confに追加します。

    kernel/mm/transparent_hugepage/enabled = never
    

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

69
David Foerster

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

「推奨」方法は、/etc/default/grubを編集し、transparent_hugepage=neverGRUB_CMDLINE_LINUX_DEFAULTを追加してから、update-grubを実行して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-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

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

* Ubuntu 14.04、MongoDB 3.0.2、およびAWSで作業しました。

24
clayzermk1

以下は、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

このソリューションはnot Ubuntu 14.04に適しており、systemdの代わりにUpstart initソリューションを使用します。

16
Mark Stosberg

以下の行を/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

これは、サーバーを再起動すると実行されます。

7
PKumar

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

テスト-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

wait 1 && servie mongod restart 

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

0
Edik Mkoyan

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

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

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

0
Ulv3r

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)を再起動して完了します。

0
Whyhankee