Linux ではオープンファイルの数が制限されているのはなぜですか?

Linux ではオープンファイルの数が制限されているのはなぜですか?

今のところ、次の方法を知っています:

  • プロセスごとのオープンファイルの制限を見つける:ulimit -n
  • すべてのプロセスによって開かれたすべてのファイルをカウントします。lsof | wc -l
  • オープンファイルの最大許容数を取得します:cat /proc/sys/fs/file-max

私の質問は、Linux ではなぜオープンファイルに制限があるのでしょうか?

答え1

その理由は、オペレーティング システムは開いている各ファイルを管理するためにメモリを必要としますが、メモリは限られたリソースであり、特に組み込みシステムではその傾向が強いためです。

ulimit -nルート ユーザーとして、プロセスごと ( 経由) およびシステムごと (例echo 800000 > /proc/sys/fs/file-max)のオープン ファイル数の最大値を変更できます。

答え2

lsof | wc -l多数の重複エントリを合計することに注意してください(フォークされたプロセスはファイル ハンドルなどを共有できます)。その数は、 で設定された制限よりもはるかに高くなる可能性があります/proc/sys/fs/file-max

Linux カーネルの観点から現在開いているファイルの数を取得するには、次のようにします。

cat /proc/sys/fs/file-nr

例: このサーバーには、最大 65536 個のうち 40096 個のファイルが開いていますが、lsof ではそれよりもはるかに大きな数が報告されます。

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504

答え3

それは主に歴史的な理由によるものだと思います。

Unix ファイル記述子は、やintなどの関数によって返され、 、、などに渡される小さな値です。opencreatreadwriteclose

少なくとも Unix の初期バージョンでは、ファイル記述子は、プロセスごとに固定サイズの構造体配列へのインデックスにすぎず、各構造体には開いているファイルに関する情報が含まれていました。私の記憶が正しければ、初期のシステムの中には、このテーブルのサイズを 20 程度に制限していたものもありました。

より現代的なシステムでは制限は高くなっていますが、主に慣性により、同じ基本スキームが維持されています。

関連情報