自己管理型配置のための 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 を有効にし、プロセス レベルで無効にすることができます。 単一のマシン上で複数のMongoDBプロセスがある場合は、バージョン8.0のプロセスが THP を有効にし、 7.0またはそれ以前のプロセスが 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