ファイル記述子の制限

ファイル記述子の制限

インストールしようとしていますが、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

答え1

~によるとカーネル文書/proc/sys/fs/file-maxはファイルの最大ファイル数、グローバル数ハンドルカーネルはブロックする前に割り当てます。これは、現在のユーザーの制限ではなく、カーネルの制限です。だからあなたはできるアイドルシステム(シングルユーザーモード、実行中のデーモンなし)に一人でいる場合は、590432を開きます。struct fileカーネルのファイルハンドルはファイル記述子とは異なります。複数のファイル記述子が同じファイルハンドルを指すことができ、ファイルハンドルも存在する可能性があります。いいえ内部的に接続された記述子です。システム全体のファイル記述子の制限はありません。これはプロセスごとにのみ適用できます。

この文書は古いものなので、/proc/sys/fs/file-max長い間使用されてきました。この点を指摘したMartin Jambonに感謝します。

SEで応答するソフト制限とハード制限の違い。ハード制限を超えない限り、通常のユーザーとしてソフト制限を増減できます。ハード制限を下げることもできます(ただし、プロセス中に再度上げることはできません)。スーパーユーザーとして、ハードとソフトの制限を増減できます。デュアル制限スキームはシステムポリシーを実施するために使用されますが、一般ユーザーが自分で一時的な制限を設定し、後で変更することもできます。

ハード制限をソフト制限より下にしようとすると(スーパーユーザーでない場合)、EINVAL無効な引数が返されます。

したがって、あなたの特定の場合ulimit(と同じulimit -Sf)は、あなたが次に興味を持っていることを意味します。シェルとそのサブプロセスで作成されたファイルサイズ。 (ほとんどの場合、これは良い考えです)

その他の通話ulimit -Hnレポートの制限-n(開いているファイル記述子の最大数)、いいえ制限がある-fため、ソフト制限がハード制限より高いようです。入力してもulimit -Hf受け取ることができますunlimited

答え2

「select」システムコールは、Windows 95を比較したときに依然として優れているように見えるUnixの多くの恐ろしい設計決定の1つです。

20年前に禁止されなければなりませんでした。もしそうなら、今はファイルハンドラを制限することに問題はありません。

カーネル構成とulimitを使用してファイルディスクリプタの数を簡単に増やすことができますが、ライブラリが "select"システムコールを使用すると、プログラムが不安定になり失敗することに注意してください(作成者が渡されたファイルディスクリプタを知ってテストしないハン)。文字数がFD_SET_MAXを超える場合は、この場合はpollまたはepollを使用するように切り替えられます(この場合、最初からそれを考慮していない理由はわかりません)。

selectは、0から1023まで(またはFD_SETハードコーディングされた定数に設定されているすべて)のファイル記述子のみを処理できます。ファイル記述子に高い値を指定すると、メモリーにランダムに挿入され、選択はこの記述子操作を決して複製しません。残念ながら、多くのライブラリはまだselectを使用しており、すべてのサンプルコードとチュートリアルでこの選択が使用されていることがわかります。

恐ろしいので、このコメントは暴言であり答えです。怒らずには答えられなかった。

関連情報