Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

自己管理型配置のための TCMalloc パフォーマンスの最適化

項目一覧

  • プラットフォーム サポート
  • THP(Transparent Huge Pages)の有効化
  • CPU ごとのキャッシュの有効化
  • 詳細

バージョン8.0で変更

MongoDB 8.0以降、 MongoDBは、メモリの断片化を減らし、高負荷のワークロードに対するデータベースをより回復性のあるものにするために、 のアップグレード バージョンを使用します。この キャッシュは、スレッドごとの キャッシュではなく、CPU ごとのキャッシュ を使用します。

新しい TCMalloc バージョンを使用するには、次のようにします。

  • サポートされているオペレーティング システムを使用します。

  • THP を有効にします。

  • CPU ごとのキャッシュを有効にします。

MongoDB 8.0をサポートするオペレーティング システムは、次の例外を除き、更新された TCMalloc もサポートします。

  • PPC 64 LEおよびs 390 xアーキテクチャ上の RHEL 8 / CentOS 8 / Oracle 8

  • PPC 64 LEアーキテクチャ上の RHEL 9 / CentOS 9 / Oracle 9

これらのオペレーティング システムでは、レガシーのTCMalloc バージョンが使用されています。 これらのオペレーティング システムを使用する場合は、 THP を無効にしてください。

WindowsはレガシーTCMalloc バージョンを使用しており、アップデートされた TCMalloc をサポートしていません。

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 を無効にしていることを確認します。

さらに、 ktunetunedパフォーマンス プロファイルを使用する RHELおよびCentOSシステムの場合は、カスタムtunedプロファイルも作成する必要があります。

THP を有効にするサービスファイルを作成するには、プラットフォームに組み込まれている初期化システムを使用します。 最近のバージョンのLinux通常、 systemctlコマンドが使用されるsystemdが使用されます。 古いバージョンのLinuxでは、 serviceコマンドを使用するSystem V initが使用される傾向があります。 詳細については、ご使用のオペレーティング システムのドキュメントを参照してください。

お使いのプラットフォームの初期化システムを使用します。

1

次のファイルを作成し、 /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ファイルを更新します。

2

systemdユニット ファイルを再読み込みし、 enable-transparent-huge-pages.serviceを使用できるようにするには、次のコマンド を実行します。

sudo systemctl daemon-reload
3

実行:

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
4

オペレーティング システムを起動するたびにこの設定が適用されるようにするには、以下のコマンドを実行します。

sudo systemctl enable enable-transparent-huge-pages
5

RHEL / CentOSでtunedまたはktuneプロファイルを使用する場合は、カスタムtunedプロファイルも作成する必要があります。

1

次のファイルを作成し、 /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
2

実行:

sudo chmod 755 /etc/init.d/enable-transparent-hugepages
3

実行:

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
4

オペレーティング システムが起動するたびにこの設定が適用されるようにするには、Linux ディストリビューションに対して次のコマンドを実行します。

ディストリビューション
コマンド

Ubuntu と Debian

sudo update-rc.d enable-transparent-hugepages defaults

SUSE

sudo insserv /etc/init.d/enable-transparent-hugepages

Red Hat、CentOS、Amazon Linux、および派生製品

sudo chkconfig --add enable-transparent-hugepages
5

RHEL / CentOS でtunedまたはktuneプロファイルを使用している場合は、カスタムtunedプロファイルも作成する必要があります。

重要

tunedまたはktuneを使用する場合は、 サービスファイルを作成した後、このセクションの手順を実行します。

tunedktuneはカーネル チューニング ユーティリティで、システムの Transparent Huge Pages 設定に影響する可能性があります。 mongodを実行中中にRHELまたはCentOSシステムでtunedまたはktuneを使用している場合は、THP が有効のままになるようにカスタムtunedプロファイルを作成する必要があります。

1

カスタムtunedプロファイルを保存するための新しいディレクトリを作成します。 次の例では、既存のvirtual-guestプロファイルを継承し、新しいプロファイルとしてvirtual-guest-thpを使用しています。

sudo mkdir /etc/tuned/virtual-guest-thp
2

/etc/tuned/virtual-guest-thp/tuned.confを作成および編集します。 次のテキストを追加します。

[main]
include=virtual-guest
[vm]
transparent_hugepages=always

この例は、既存のvirtual-guestプロファイルを継承しています。 システムに適したプロファイルを選択します。

3

実行:

sudo tuned-adm profile virtual-guest-thp
1

既存のプロファイルから新しいプロファイルを作成するには、関連するディレクトリをコピーします。 次の例では、 virtual-guestプロファイルをベースとして使用し、 virtual-guest-thpを新しいプロファイルとして使用します。

sudo cp -r /etc/tune-profiles/virtual-guest /etc/tune-profiles/virtual-guest-thp
2

/etc/tune-profiles/virtual-guest-thp/ktune.shを編集し、 set_transparent_hugepagesの設定を次のように変更します。

set_transparent_hugepages always
3

新しいプロファイルを有効にします。

sudo tuned-adm profile virtual-guest-thp

TCMalloc が CPU ごとのキャッシュで実行中されていることを確認するには、以下を確認します。

CPU ごとのキャッシュが有効になっていない場合は、以下を確認します。

  • glibcrsq を無効にします。

  • Linuxカーネル バージョン4.18以降を使用している。

新しい 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

戻る

パフォーマンス