Docs Menu
Docs Home
/

UNIXulimit 自己管理型配置の設定

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

mongodと はそれぞれスレッドとファイル記述子を使用して接続を追跡し、内部操作を管理します。このセクションでは、mongos 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: ユーザーがいつでもアクティブにできるプロセスの最大数。非ルート プロセスではそれを増やすことはできません。

  • "柔らかい" 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 ユーザー スライスは、ユーザーのプロセスのリソースを制限します。

Homebrew インストール メソッドを使用してMongoDB Community Edition をインストールした macOS システムの場合、brew services 経由でMongoDB を起動したときに、オープン ファイル制限が自動的に設定されないことがあります。ulimit 値を手動で設定する必要がある場合があります。

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

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

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

次の設定は、mongodmongos の配置では特に重要です。

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

  • -t (CPU 時間): unlimited

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

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

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

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

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

の設定を変更して変更を適用するには、 mongodインスタンスとmongos インスタンスを再起動します。ulimit

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

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

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>

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>

注意

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 を省略できます。

戻る

レート制限の設定

項目一覧