AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

UNIX ulimit Settings for Self-Managed Deployments

Linux や macOS を含むほとんどの UNIX 系オペレーティング システムでは、スレッド、ファイル、ネットワーク接続などのシステム リソースの使用をプロセスごと、ユーザーごとに制限および制御する方法が提供されています。これらの "ulimits" により、単一のユーザーがシステム リソースを過剰に使用することが防止されます。場合によっては、これらの制限のデフォルト値が低く、MongoDB の通常操作中にいくつかの問題が発生する可能性があります。

mongodmongos はそれぞれスレッドとファイル記述子を使用して接続を追跡し、内部操作を管理します。このセクションでは、MongoDB の一般的なリソース使用パターンについて説明します。これらの数値を配置情報と合わせて使用することで、理想的な ulimit 設定を決定します。

通常、すべての mongod および mongos インスタンスは、次のように動作します。

  • 2 つのファイル記述子および 1 つのスレッドを使用して、各受信接続を追跡します。

  • 各内部スレッドまたは pthread をシステムプロセスとして追跡します。

  • mongodインスタンスによって使用されるデータ ファイルごとに 1 つのファイル記述子。

  • mongodインスタンスによって使用されるジャーナル ファイルごとに 1 つのファイル記述子。

  • レプリカセットでは、各 mongod はセット内の他のすべてのノードとの接続を維持します。

mongod は、TTL コレクション、レプリケーション、レプリカセットのヘルスチェックなどのいくつかの内部プロセスにバックグラウンド スレッドを使用します。これには、追加のリソースがいくつか必要になる場合があります。

クライアント接続に対するスレッドとファイル記述子に加えて、mongos はすべてのコンフィギュレーションサーバーとすべてのシャードへの接続を維持する必要があります。これには、すべてのレプリカセットのすべてのノードが含まれます。

mongos については、次の動作を考慮してください。

  • mongos インスタンスが各シャードへの接続プールを維持することで、mongos は接続を再利用し、新しい接続を作成する必要なくリクエストを迅速に処理できます。

  • net.maxIncomingConnections 実行時オプションを使用して、受信接続の数を制限できます。受信接続の数を制限することで、mongosmongod インスタンスに過剰な接続を作成するというカスケード効果を防ぐことができます。

次の例のように、システム プロンプトで ulimit コマンドを使用して、システム制限を確認できます。

$ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 64000
-n: file descriptors 64000
-l: locked-in-memory size (kb) unlimited
-v: address space (kb) unlimited
-x: file locks unlimited
-i: pending signals 192276
-q: bytes in POSIX msg queues 819200
-e: max nice 30
-r: max rt priority 65
-N 15: unlimited

ulimit とは、さまざなリソースのユーザーごとの制限のことです。したがって、mongod インスタンスが複数のプロセス、つまり複数の mongod プロセスも実行しているユーザーとして実行される場合、これらのリソースの競合が発生する可能性があります。processes 値(つまり -u)は、個別のプロセスとサブプロセス スレッドの合計数を表します。

Linux では、次の形式のコマンドを発行して ulimit 設定を変更できます。

ulimit -n <value>

ulimit には、次の2種類があります。

  • "ハード" ulimit: ユーザーがいつでもアクティブにできるプロセスの最大数。ルート以外のプロセスは増加できません。

  • "soft" ulimit: セッションまたはプロセスに対して強制される制限。どのプロセスでも、「ハード」ulimit まで増やすことができます。

重要

「ソフト」ulimit が低いと、接続数が多くなりすぎるとcan't create new thread, closing connection エラーが発生する可能性があります。両方の ulimit 値を推奨値に設定します。

ulimit 制限値を変更するときに -H または -S 修飾子が指定されていない限り、「ハード」値と「ソフト」値の両方を変更します。

Linux の多くのディストリビューションでは、ulimit -a の出力内の可能な値を -n オプションに置き換えることで値を変更できます。

ulimit 設定を変更した後、変更した設定を有効にするにはプロセスを再起動する必要があります。Linux では、/proc ファイル システムを使用して、実行中のプロセスの現在の制限を確認できます。

システムの構成とデフォルト設定によっては、ulimit を使用して行ったシステム制限の変更が、システムの再起動後に元に戻る可能性があります。詳細については、ディストリビューションおよびオペレーティング システムのドキュメントを確認してください。

通常は、ulimit 設定を使用する systemctl を使用して、次のように mongod を開始する必要があります。

systemctl start mongod.service

systemctl を使用して mongod を起動しない場合、 systemd によってulimit 設定の一部が上書きされます。たとえば、次のコマンドに示すように mongod を起動すると、ユーザー スライス(user-1000.slice など)の systemd 設定が使用されます。

mongod --config ~/mongod.conf

注意

systemd ユーザー スライスは、ユーザーのプロセスのリソースを制限します。

brew を使ったインストール方法で MongoDB Community をインストールした macOS システムの場合、 brew services を通して MongoDB を起動すると、推奨されるオープン ファイル値が自動的に設定されます。

MongoDB Enterprise を実行中の macOS システム、または TGZ からのインストール方法を使用した macOS システムの場合は、ulimit コマンドを使用して推奨値を設定します。稼働中のシステムのシステム制限を変更する正確な手順については、オペレーティングシステムのドキュメントを参照してください。

Red Hat Enterprise Linux および CentOS 6 と 7 では、それぞれの最大プロセス制限 nproc が適用され、それにより ulimit 設定が上書きされます。この値は、バージョンに応じて次の構成ファイルで定義されます。

バージョン
ファイル

RHEL / CentOS 7

4096

/etc/security/limits.d/20-nproc.conf

RHEL / CentOS 6

1024

/etc/security/limits.d/90-nproc.conf

To configure an nproc value for these versions, create a file named /etc/security/limits.d/99-mongodb-nproc.conf with new soft nproc and hard nproc values to increase the process limit. For recommended values, see Recommended ulimit Settings.

RHEL および CentOS 8 では、個別の nproc 値は不要になりました。ulimit コマンドは、RHEL および CentOS 8 で必要な最大プロセス値を構成するのに十分です。

次の設定は、「mongod」と「mongos」の配置にとって特に重要です。

  • -f (ファイル サイズ): unlimited

  • -t (CPU 時間): unlimited

  • -v (仮想記憶): unlimited [1]

  • -l (ロック済みインメモリ サイズ): unlimited

  • -n (オープンするファイル): 64000

  • -m (メモリサイズ): unlimited [1] [2]

  • -u (プロセスおよびスレッド): 64000

ulimit 設定を変更した後は、変更を適用するために mongod および mongos インスタンスを再起動してください。

  • mongodまたはmongosインスタンスへの受信接続には2 つのファイル記述子が必要です。

  • macOS プラットフォームの場合、推奨されるプロセス制限値は 2500 であり、これはこのプラットフォームで構成可能な最大値です。

For Linux distributions that use Upstart, you can specify limits within service scripts if you start mongod or mongos instances as Upstart services. You can do this by using limit stanzas.

Specify the Recommended ulimit Settings, as in the following example:

limit fsize unlimited unlimited # (file size)
limit cpu unlimited unlimited # (cpu time)
limit as unlimited unlimited # (virtual memory size)
limit memlock unlimited unlimited # (locked-in-memory size)
limit nofile 64000 64000 # (open files)
limit nproc 64000 64000 # (processes/threads)

limit スタンザは「ソフト」リミットを最初に指定された値に設定し、「ハード」リミットを 2 番目の値に設定します。

limit スタンザを変更したら、次の形式でアプリケーション サービスを再起動して、変更が反映されることを確認します。

restart <service name>

mongod または mongos インスタンスを systemd サービスとして起動する場合は、そのサービス ファイルの [Service] セクション内で制限を指定できます。サービス ファイルは /etc/systemd/system/<process-name>.service のような場所にあります。

リソース制限ディレクティブ を使用して制限を設定できます 。

Specify the Recommended ulimit Settings, as in the following example:

[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (locked-in-memory size)
LimitMEMLOCK=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000

systemd limit ディレクティブは、「ハード」リミットと「ソフト」リミットの両方に対して指定された値を設定します。

limit スタンザを変更したら、次の形式でアプリケーション サービスを再起動して、変更が反映されることを確認します。

systemctl restart <service name>

注意

yumapt などのパッケージ マネージャーを使用して MongoDB をインストールした場合、インストールの一部としてインストールされたサービス ファイルには、これらの ulimit の値がすでに含まれています。

注意

このセクションは Linux オペレーティング システムにのみ適用されます。

/proc ファイル システムは、 /proc/<pid>/limits にあるファイル システム オブジェクトにプロセスごとの制限値を格納します。ここでの <pid>はプロセスのPIDまたはプロセス識別子です。次の bash 関数を使用すると、指定された名前のプロセスまたはプロセス群の limits オブジェクトの内容を返すことができます。

return-limits(){
for process in $@; do
process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`
if [ -z $@ ]; then
echo "[no $process running]"
else
for pid in $process_pids; do
echo "[$process #$pid -- limits]"
cat /proc/$pid/limits
done
fi
done
}

この関数をコピーして現在の shell セッションに貼り付けるか、スクリプトの一部として読み込むことができます。次のいずれかの呼び出し方で関数を呼び出します。

return-limits mongod
return-limits mongos
return-limits mongod mongos
[1](1, 2) MongoDB を実行しているシステムで仮想メモリまたは常駐メモリのサイズを制限すると、オペレーティング システムは追加の割り当てリクエストの受け入れを拒否します。
[2] ulimit-m パラメーターは、カーネル バージョンが 2.4.30 より新しい Linux システムには影響しません。必要に応じて -m を省略できます。