自己管理型配置の UNIX ulimit
設定
Linux や macOS を含むほとんどの UNIX 系オペレーティング システムでは、スレッド、ファイル、ネットワーク接続などのシステム リソースの使用をプロセスごとおよびユーザーごとに制限および制御する方法が提供されています。これらの "ulimits" は、単一のユーザーがシステム リソースを過剰に使用することを防ぎます。場合によっては、これらの制限のデフォルト値が低く、MongoDB の通常操作にさまざまな問題が発生させる可能性があります。
リソース利用
mongod
と mongos
はそれぞれスレッドとファイル記述子を使用して接続を追跡し、内部操作を管理します。このセクションでは、MongoDB の一般的なリソース使用パターンについて説明します。これらの数値を、配置とその使用に関する実際の情報と組み合わせて使用することで、理想的な ulimit
設定を決定します。
通常、すべての mongod
および mongos
インスタンスは、次のように動作します。
2 つのファイル記述子および 1 つのスレッドを使用して、各受信接続を追跡します。
各内部スレッドまたは pthread をシステムプロセスとして追跡します。
mongod
mongod
インスタンスによって使用されるデータ ファイルごとに 1 つのファイル記述子。mongod
インスタンスによって使用されるジャーナル ファイルごとに 1 つのファイル記述子。レプリカセットでは、各
mongod
はセット内の他のすべてのノードとの接続を維持します。
mongod
は、TTL コレクション、レプリケーション、レプリカセットのヘルスチェックなどの多くの内部プロセスにバックグラウンド スレッドを使用します。これには、少量の追加リソースが必要になる場合があります。
mongos
クライアント接続に対するスレッドとファイル記述子に加えて、mongos
はすべてのコンフィギュレーションサーバーとすべてのシャードへの接続を維持する必要があります。これには、すべてのレプリカセットのすべてのノードが含まれます。
mongos
については、次の動作を考慮してください。
mongos
インスタンスが各シャードへの接続プールを維持することで、mongos
は接続を再利用し、新しい接続を作成する必要なくリクエストを迅速に処理できます。net.maxIncomingConnections
実行時オプションを使用して、受信接続の数を制限できます。受信接続の数を制限することで、mongos
がmongod
インスタンスに過剰な接続を作成するというカスケード効果を防ぐことができます。
リソース制限の検討と設定
ulimit
次の例のように、システム プロンプトで 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
ユーザー スライスは、ユーザーのプロセスのリソースを制限します。
MacOS
brew を使ったインストール方法で MongoDB Community をインストールした macOS システムの場合、 brew services
を通して MongoDB を起動すると、推奨されるオープン ファイル値が自動的に設定されます。
MongoDB Enterprise を実行中の macOS システム、または TGZ からのインストール方法を使用した macOS システムの場合は、ulimit
コマンドを使用して推奨値を設定します。稼働中のシステムのシステム制限を変更する正確な手順については、オペレーティングシステムのドキュメントを参照してください。
Red Hat Linux Enterprise Server および CentOS
Red Hat Enterprise Linux および CentOS 6 と 7 では、それぞれの最大プロセス制限 nproc
が適用され、それにより ulimit
設定が上書きされます。この値は、バージョンに応じて次の構成ファイルで定義されます。
バージョン | 値 | ファイル |
---|---|---|
RHEL / CentOS 7 | 4096 |
|
RHEL / CentOS 6 | 1024 |
|
これらのバージョンでnproc
値を構成するには、プロセス制限を増やすために、新しいsoft nproc
値とhard nproc
値を含む/etc/security/limits.d/99-mongodb-nproc.conf
という名前のファイルを作成します。 推奨値については、「推奨されるulimit
設定 」を参照してください。
RHEL および CentOS 8 では、個別の nproc
値は不要になりました。ulimit
コマンドは、RHEL および CentOS 8 で必要な最大プロセス値を構成するのに十分です。
推奨される ulimit
設定
各配置には固有の要件と設定がある可能性がありますが、次のしきい値と設定は mongod
および mongos
デプロイメントでは特に重要です。
-f
(ファイル サイズ):unlimited
-t
(CPU 時間):unlimited
-v
(仮想記憶):unlimited
[1]-l
(ロックされたメモリのサイズ):unlimited
-n
(開いているファイル):64000
-u
(プロセス/スレッド):64000
ulimit
設定を変更した後は、変更を有効にするために必ず
mongod
および mongos
インスタンスを再起動してください。
Considerations
アップサートを使用した Linux ディストリビューション
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>
systemd
を使用する Linux ディストリビューション
mongod
や mongos
インスタンスを 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>
注意
yum
や apt
などのパッケージ マネージャーを使用して MongoDB をインストールした場合、インストールの一部としてインストールされたサービス ファイルには、これらの ulimit の値がすでに含まれています。
/proc
ファイル システム
注意
このセクションは 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 を省略できます。 |