389-ds
をインストールしようとしていますが、次の警告が表示されます。
WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.
ファイル記述子については理解していますが、ソフト制限とハード制限については理解していません。
cat /proc/sys/fs/file-max
を実行すると、590432
が返されます。これは、最大590432個のファイルを開くことができることを意味します(つまり、最大590432個のファイル記述子を持つことができます)。
しかし、ulimit
を実行すると、異なる結果が得られます。
$ ulimit
unlimited
$ ulimit -Hn # Hard limit
4096
$ ulimit -Sn # Soft limit
1024
しかし、ulimit
のハード制限とソフト制限はどのようなもので、/proc/sys/fs/file-max
に格納されている数とどのように関連していますか?
カーネルのドキュメント によると、/proc/sys/file-max
は、カーネルが窒息する前に割り当てるファイル記述子の最大、合計、グローバル数です。これはカーネルの制限であり、現在のユーザーの制限ではありません。したがって、アイドル状態のシステム(シングルユーザーモード、デーモンが実行されていない)で一人でいる場合、590432を開くことができます。
ドキュメントが古くなっていることに注意してください。ファイルは長い間proc/sys/fs/file-max
でした。これを指摘してくれたMartin Jambonに感謝します。
ソフト制限とハード制限の違いは、SEでここに回答されます 。ハード制限を超えない限り、通常のユーザーとしてソフト制限を増減できます。ハードリミットを下げることもできます(ただし、そのプロセスで再度上げることはできません)。スーパーユーザーは、ハード制限とソフト制限の両方を上下できます。二重制限スキームは、システムポリシーを適用するために使用されますが、通常のユーザーが自分自身に一時的な制限を設定し、後でそれらを変更することもできます。
ハード制限をソフト制限よりも低くしようとすると(スーパーユーザーではない場合)、EINVAL
が返されます(無効な引数)。
したがって、特定のケースでは、ulimit
(ulimit -Sf
と同じ)は、シェルによって書き込まれたファイルのサイズにソフト制限がないと言い、そのサブプロセス。 (それはおそらくほとんどの場合に良い考えです)
他の呼び出しulimit -Hn
は、-n
制限(開いているファイル記述子の最大数)をレポートしますが、 not -f
制限があるため、これが理由ですソフト制限はハード制限よりも高いようです。 ulimit -Hf
と入力すると、「無制限」も取得できます。
"select"システムコールは、unixの多くのひどい頭の痛い設計決定の1つであり、windows95でも比較すると非常によく見えます。
これは20年前に禁止されるべきでしたが、今では問題なく無制限のファイルハンドラーを使用できる可能性があります。
カーネル構成とulimitを使用すると、ファイル記述子の数を簡単に増やすことができますが、ライブラリが「select」システムコールを使用すると、プログラムが不安定になり(メモリ破損)、失敗することに注意してください。
Selectは0から1023までのファイル記述子のみを処理できます。より高い値のファイル記述子をフィードすると、メモリ内でランダムに突き出て、selectが記述子を機能するように繰り返すことはありません。残念ながら、多くのライブラリはselectを使用しています。