バージョン8.0で変更。
MongoDB 8.0以降、 MongoDBは、メモリのフラグメント化を減らし、高負荷のワークロードに対するデータベースの回復力を高めます。
新しい TCMalloc バージョンを使用するには、次のようにします。
プラットフォーム サポート
更新された TCMalloc のサポートは CPU アーキテクチャによって異なります。MongoDB 8.0 をサポートする Linux システムは、x86_64 アーキテクチャと ARM64 アーキテクチャのみで更新された TCMalloc をサポートします。
MongoDBは、オペレーティングシステムのバージョンに関わらず、PPC64LE および s390x アーキテクチャでレガシー 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、および派生製品 | |
と を使用するtunedktune
重要
tunedまたはktuneを使用する場合は、 サービスファイルを作成した後、このセクションの手順を実行します。
tuned and ktune are kernel tuning utilities that can affect the Transparent Hugepages setting on your system. If you are using tuned or ktune on your RHEL or CentOS system while running mongod, you must create a custom tuned profile to ensure that THP stays enabled.
CPU ごとのキャッシュの有効化
TCMalloc が CPU ごとのキャッシュで実行中されていることを確認するには、以下を確認します。
tcmalloc.usingPerCPUCachesはtrueです。tcmalloc.tcmalloc.cpu_freeは0より大きいです。
CPU ごとのキャッシュが有効になっていない場合は、以下を確認します。
glibcrsq を無効にします。
Linuxカーネル バージョン4.18以降を使用している。
glibc trigger を無効化する
新しい TCMalloc では、CPU ごとのキャッシュを実装するために 再起動可能なシーケンス (rseq)が必要です。glibc ライブラリなどの別のアプリケーションが TCMalloc より前に RSeq 構造を登録する場合、TCMalloc は RSeq を使用できません。rsq がない場合、TCMalloc はスレッドごとのキャッシュを使用します。これはレガシーTCMalloc バージョンで使用されます。
CPU ごとのキャッシュを有効にするには、mongodを起動する前に次の環境変数を設定して glibc の rseq 登録を無効にします。
GLIBC_TUNABLES=glibc.pthread.rseq=0 export GLIBC_TUNABLES
カーネル バージョンの確認
glibc rseq を無効にした後もプロセッサーごとのキャッシュが有効にならない場合は、Linux カーネル 4.18 以降を使用していることを確認してください。
uname -r