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

UNIXulimit 自己管理型配置の設定

項目一覧

  • リソース利用
  • リソース制限の検討と設定

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

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

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

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

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

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

  • mongodstorage.journal.enabledtrue の場合に インスタンスによって使用されるジャーナル ファイルごとに 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>

MongoDB のパフォーマンスに影響を与える ulimit には「ハード」と「ソフト」の両方があります。「ハード」 ulimit は、ユーザーがいつでもアクティブにできるプロセスの最大数を指します。これが上限で、ルート以外のプロセスでは「ハード」ulimit を増やすことはできません。対照的に、「ソフト」 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 を起動すると、推奨されるオープン ファイル値が自動的に設定されます。 詳細については、「 brew を使用して MongoDB を実行する」を参照してください。

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

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

これらのバージョンでnproc値を構成するには、プロセス制限を増やすために、新しいsoft nproc値とhard nproc値を含む/etc/security/limits.d/99-mongodb-nproc.confという名前のファイルを作成します。 推奨値については、「推奨されるulimit設定 」を参照してください。

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 であり、これはこのプラットフォームで構成可能な最大値です。

Upstart を使用する Linux ディストリビューションの場合、 mongod } インスタンスおよびmongosインスタンスを Upstart サービスとして起動すると、サービス スクリプト内で制限を指定できます。 これを実現するには、limit スタンザ を使用します。 。

次の例のように、推奨されるulimit設定を指定します。

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>

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

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

次の例のように、推奨されるulimit設定を指定します。

[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]12 MongoDB を実行中のシステムで仮想メモリまたは常駐メモリのサイズを制限すると、オペレーティング システムは追加の割り当てリクエストを拒否します。
[2] ulimit-m パラメーターは、カーネル バージョンが 2.4.30 より新しい Linux システムには影響しません。必要に応じて -m を省略できます。

戻る

ヘルスマネージャー