概要
Dockerコンテナ上でMongoDBを動かしているとき、ログファイルにtransparent_hugepage関連のWARNINGが出ていることに気がつきました。
2018-08-15T06:38:47.743+0000 I CONTROL [initandlisten]
2018-08-15T06:38:47.743+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-08-15T06:38:47.743+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-08-15T06:38:47.743+0000 I CONTROL [initandlisten]
2018-08-15T06:38:47.743+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-08-15T06:38:47.743+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-08-15T06:38:47.743+0000 I CONTROL [initandlisten]
2018-08-15T06:38:47.745+0000 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory '/opt/storage/diagnostic.data'
2018-08-15T06:38:47.753+0000 I NETWORK [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
それぞれのWARNINGで never
を設定するように促されました。
そもそもTransparent Huge Page (THP) とは何なのかを調べてみると、MongoDBの公式ドキュメントに以下の記事がありました。
原文
Transparent Huge Pages (THP) is a Linux memory management system that reduces the overhead of Translation Lookaside Buffer (TLB) lookups on machines with large amounts of memory by using larger memory pages.
However, database workloads often perform poorly with THP, because they tend to have sparse rather than contiguous memory access patterns. You should disable THP on Linux machines to ensure best performance with MongoDB.
日本語訳
Transparent Huge Pages(THP)は、大きなメモリーページを使用して大量のメモリーを持つマシンでTranslation Lookaside Buffer(TLB)ルックアップのオーバーヘッドを削減するLinuxメモリー管理システムです。
ただし、データベースワークロードは、連続したメモリアクセスパターンではなく、希薄な傾向があるため、THPでパフォーマンスが低下することがよくあります。 LinuxマシンでTHPを無効にして、MongoDBで最高のパフォーマンスを確保する必要があります。
THPの仕組みはメモリを大きな単位で扱えるようにして一般的には性能の向上が図れますが、MongoDBなどのデータベースシステムとは相性が良くないようです。そのためTHPを無効化するようにログファイルからWARNINGとして促しています。
対処方法
sysfsutils
パッケージをインストールして /etc/sysfs.conf
ファイルへTHPを無効化する行を追記することでWARNINGを消すことができます。
...(略)...
RUN yum install -y sysfsutils
RUN echo 'kernel/mm/transparent_hugepage/enabled = never' >> /etc/sysfs.conf \
&& echo 'kernel/mm/transparent_hugepage/defrag = never' >> /etc/sysfs.conf
これでTHPによるMongoDBのパフォーマンス劣化が改善できます。
試したこと (失敗編)
THPを無効化するためDockerfileから以下のように never
を該当のファイルへ追記してみました。
RUN echo never > /sys/kernel/mm/transparent_hugepage/enabled \
&& echo never > /sys/kernel/mm/transparent_hugepage/defrag
すると、Dockerイメージのビルド時に以下のエラーで怒られてしまいました。
/bin/sh: /sys/kernel/mm/transparent_hugepage/enabled: Read-only file system
どうやら読み取り専用のファイルのためDockerfileからechoコマンドによる追記はできないようです。