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>
ulimit 次の 2 つのタイプがあります。
"ハード"
ulimit: ユーザーがいつでもアクティブにできるプロセスの最大数。非ルート プロセスではそれを増やすことはできません。"柔らかい"
ulimit: セッションまたはプロセスに適用される制限。どのプロセスでも、「ハード」ulimitまで増やすことができます。
重要
ulimitcan'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
Homebrew インストール メソッドを使用してMongoDB Community Edition をインストールした macOS システムの場合、brew services 経由でMongoDB を起動したときに、オープン ファイル制限が自動的に設定されないことがあります。ulimit 値を手動で設定する必要がある場合があります。
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
の設定を変更して変更を適用するには、 mongodインスタンスとmongos インスタンスを再起動します。ulimit
Considerations
アップサートを使用した Linux ディストリビューション
Upstartmongod を使用するLinuxディストリビューションの場合、 または インスタンスを Upstart サービスとして起動すると、サービス スクリプト内で制限を指定できます。mongoslimit スタンザを使用することで、これを実現できます。
次の例のように、推奨される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>
Linux ディストリビューション systemd
mongodmongossystemdまたは インスタンスを[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 を省略できます。 |