自己管理型配置のための TCMalloc パフォーマンスの最適化
バージョン8.0で変更。
MongoDB 8.0以降、 MongoDBは、メモリの断片化を減らし、高負荷のワークロードに対するデータベースをより回復性のあるものにするために、 のアップグレード バージョンを使用します。この キャッシュは、スレッドごとの キャッシュではなく、CPU ごとのキャッシュ を使用します。
新しい TCMalloc バージョンを使用するには、次のようにします。
プラットフォーム サポート
MongoDB 8.0をサポートするオペレーティング システムは、次の例外を除き、更新された TCMalloc もサポートします。
PPC 64 LEアーキテクチャ上の RHEL 9 / CentOS 9 / Oracle 9
これらのオペレーティング システムでは、レガシーのTCMalloc バージョンが使用されています。 これらのオペレーティング システムを使用する場合は、 THP を無効にしてください。
WindowsはレガシーTCMalloc バージョンを使用しており、アップデートされた TCMalloc をサポートしていません。
THP(Transparent Huge Pages)の有効化
Transparent Huge Pages(THP)は、TLB(TransparentLookaideになります。)の検索のオーバーヘッドを削減するLinuxメモリ管理システムです。 THP は、小さなページを結合し、アプリケーションに対してより大きなメモリページとして表示されるようにすることで、これを実現します。
MongoDB 8.0以降では、プラットフォームの初期化システム用のサービスファイルを作成して、 mongod
が起動する前に THP が有効になっていることを確認します。 MongoDB 7.0またはそれ以前のバージョンを使用している場合は、 THP を無効にします。
注意
THP はシステム レベルで動作するため、システムの下のすべてのプロセスに適用されます。プロセスごとのレベルで THP を有効または無効にすることはできません。
さらに、 ktune
とtuned
パフォーマンス プロファイルを使用する RHELおよびCentOSシステムの場合は、カスタムtuned
プロファイルも作成する必要があります。
サービス ファイルを作成
THP を有効にするサービスファイルを作成するには、プラットフォームに組み込まれている初期化システムを使用します。 最近のバージョンのLinux通常、 systemctl
コマンドが使用されるsystemdが使用されます。 古いバージョンのLinuxでは、 service
コマンドを使用するSystem V initが使用される傾向があります。 詳細については、ご使用のオペレーティング システムのドキュメントを参照してください。
お使いのプラットフォームの初期化システムを使用します。
systemd
ユニットファイルを作成
次のファイルを作成し、 /etc/systemd/system/enable-transparent-huge-pages.service
に保存します。
[Unit] Description=Enable Transparent Hugepages (THP) DefaultDependencies=no After=sysinit.target local-fs.target Before=mongod.service [Service] Type=oneshot ExecStart=/bin/sh -c 'echo always | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null' [Install] WantedBy=basic.target
注意
Red Hat Enterprise Linux の一部のバージョン、およびその他の Red Hat ベースの派生製品では、THP enabled
ファイルに異なるパスが使用されます。
/sys/kernel/mm/redhat_transparent_hugepage/enabled
システムでどのパスが使用されているかを確認し、それに応じてenable-transparent-huge-pages.service
ファイルを更新します。
サービスを開始する
実行:
sudo systemctl start enable-transparent-huge-pages
関連する THP 設定が変更されたことを確認するには、次のコマンドを実行します。
cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
Red Hat Enterprise Linux およびその他の Red Hat ベースの派生物では、代わりに以下を使用する必要があります。
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled && cat /sys/kernel/mm/redhat_transparent_hugepage/defrag && cat /sys/kernel/mm/redhat_transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
出力は、次のようになります。
always defer+madvise 0 1
init.d
スクリプトの作成
次のファイルを作成し、 /etc/init.d/enable-transparent-hugepages
に保存します。
!/bin/bash ## BEGIN INIT INFO Provides: enable-transparent-hugepages Required-Start: $local_fs Required-Stop: X-Start-Before: mongod mongodb-mms-automation-agent Default-Start: 2 3 4 5 Default-Stop: 0 1 6 Short-Description: Enable Linux Transparent Hugepages Description: Enable Linux Transparent Hugepages, to improve database performance. ## END INIT INFO case $1 in start) if [ -d /sys/kernel/mm/transparent_hugepage ]; then thp_path=/sys/kernel/mm/transparent_hugepage elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then thp_path=/sys/kernel/mm/redhat_transparent_hugepage else return 0 fi echo 'always' | tee ${thp_path}/enabled > /dev/null && echo defer+madvise | tee ${thp_path}/defrag > /dev/null && echo 0 | tee ${thp_path}/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null' unset thp_path ;; esac
スクリプトを実行する
実行:
sudo /etc/init.d/enable-transparent-hugepages start
関連する THP 設定が変更されたことを確認するには、次のコマンドを実行します。
cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
Red Hat Enterprise Linux およびその他の Red Hat ベースの派生物では、代わりに以下を使用する必要があります。
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
出力は、次のようになります。
always defer+madvise 0 1
起動時に実行するようにオペレーティング システムを構成する
オペレーティング システムが起動するたびにこの設定が適用されるようにするには、Linux ディストリビューションに対して次のコマンドを実行します。
ディストリビューション | コマンド | |
---|---|---|
Ubuntu と Debian |
| |
SUSE |
| |
Red Hat、CentOS、Amazon Linux、および派生製品 |
|
と を使用するtuned
ktune
重要
tuned
またはktune
を使用する場合は、 サービスファイルを作成した後、このセクションの手順を実行します。
tuned
とktune
はカーネル チューニング ユーティリティで、システムの Transparent Huge Pages 設定に影響する可能性があります。 mongod
を実行中中にRHELまたはCentOSシステムでtuned
またはktune
を使用している場合は、THP が有効のままになるようにカスタムtuned
プロファイルを作成する必要があります。
CPU ごとのキャッシュの有効化
TCMalloc が CPU ごとのキャッシュで実行中されていることを確認するには、以下を確認します。
tcmalloc.usingPerCPUCaches
はtrue
です。tcmalloc.tcmalloc.cpu_free
は0
より大きいです。
CPU ごとのキャッシュが有効になっていない場合は、以下を確認します。
glibcrsq を無効にします。
Linuxカーネル バージョン4.18以降を使用している。
glibc trigger を無効化する
新しい TCMalloc には再起動可能な シーケンス(rseq) が必要です CPU ごとのキャッシュを実装します。glibc ライブラリなどの別のアプリケーションが TCMalloc より前に RSeq 構造を登録する場合、TCMalloc は RSeq を使用できません。 rsq がない場合、TCMalloc はスレッドごとのキャッシュを使用します。これはレガシーTCMalloc バージョンで使用されます。
TCMalloc が RSeq を使用して CPU ごとのキャッシュを有効にするには、 glibc の RSeq 構造の登録を無効にします。 glibc を無効にするには、 mongod
を起動する前に次の環境変数を設定します。
GLIBC_TUNABLES=glibc.pthread.rseq=0 export GLIBC_TUNABLES
カーネル バージョンの確認
glibc rseq を無効にし、かつ CPU ごとのキャッシュがまだ有効になっていない場合は、 Linuxカーネル バージョン4.18以降を使用していることを確認してください。 カーネルのバージョンを確認するには、次のコマンドを実行します。
uname -r