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 については、次の動作を考慮してください。
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: unlimitedulimit とは、さまざなリソースのユーザーごとの制限のことです。したがって、mongod インスタンスが複数のプロセス、つまり複数の mongod プロセスも実行しているユーザーとして実行される場合、これらのリソースの競合が発生する可能性があります。processes 値(つまり -u)は、個別のプロセスとサブプロセス スレッドの合計数を表します。
Linux では、次の形式のコマンドを発行して ulimit 設定を変更できます。
ulimit -n <value>ulimit には、次の2種類があります。
"ハード"
ulimit: "ソフト" がリソースのulimitは に引き上げられます。非ルート プロセスではそれを増やすことはできません。"soft"
ulimit: セッションまたはプロセスに対して強制される制限。どのプロセスでも、「ハード」ulimitまで増やすことができます。
重要
「ソフト」ulimit が低いと、接続数が多くなりすぎるとcan't create new thread, closing connection エラーが発生する可能性があります。両方の ulimit 値を推奨値に設定します。
オープンしているファイル数のulimit値が64000未満の場合、MongoDB は起動警告を生成します。
ulimit の値が低いと、 MongoDB の使用頻度が高い場合に悪影響が生じ、接続が失敗し、サービスが失われる可能性があります。
ulimit 制限値を変更するときに -H または -S 修飾子が指定されていない限り、「ハード」値と「ソフト」値の両方を変更します。
Linux の多くのディストリビューションでは、ulimit -a の出力内の可能な値を -n オプションに置き換えることで値を変更できます。
ulimit 設定を変更した後、変更した設定を有効にするにはプロセスを再起動する必要があります。Linux では、/proc ファイル システムを使用して、実行中のプロセスの現在の制限を確認できます。
システムの構成とデフォルト設定によっては、ulimit を使用して行ったシステム制限の変更が、システムの再起動後に元に戻る可能性があります。詳細については、ディストリビューションおよびオペレーティング システムのドキュメントを確認してください。
通常は、ulimit 設定を使用する systemctl を使用して、次のように mongod を開始する必要があります。
systemctl start mongod.servicesystemctl を使用して 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 7 では、別の最大プロセス制限 nproc が適用され、それにより ulimit 設定が上書きされます。デフォルトでは 、この制限は 4096 であり、 /etc/security/limits.d/20-nproc.conf構成ファイルで定義されています。
nproc値を構成するには、プロセス制限を増やすために、新しい 値と/etc/security/limits.d/99-mongodb-nproc.conf soft nprochard nproc値を含む という名前のファイルを作成します。推奨値については、「 推奨されるulimit 設定 」を参照してください。
RHEL および CentOS 8 では、個別の nproc 値は不要になりました。ulimit コマンドは、RHEL および CentOS 8 で必要な最大プロセス値を構成するのに十分です。
推奨されるulimit 設定
次の設定は、「mongod」と「mongos」の配置にとって特に重要です。
-f(ファイル サイズ):unlimited-t(CPU 時間):unlimited-v(virtual memory):unlimited[1]-l(ロック済みインメモリ サイズ):unlimited-n(オープンするファイル):64000-u(プロセスおよびスレッド):64000
ulimit 設定を変更した後は、変更を適用するために mongod および mongos インスタンスを再起動してください。
Considerations
macOS プラットフォームの場合、推奨されるプロセス制限値は
2500であり、これはこのプラットフォームで構成可能な最大値です。
Linux ディストリビューション systemd
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 "$process_pids" ]; 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 mongodreturn-limits mongosreturn-limits mongod mongos| [1] | (1, 2) If you limit virtual or resident memory size on a system running MongoDB the operating system refuses to honor additional allocation requests. |
| [2] | ulimit の -m パラメーターは、カーネル バージョンが 2.4.30 より新しい Linux システムには影響しません。必要に応じて -m を省略できます。 |