web-dev-qa-db-ja.com

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

今、私は次の方法を知っています:

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

私の質問は、Linuxで開くことができるファイルに制限があるのはなぜですか?

143
xanpeng

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

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

91
jofel

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
67
grebneke

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

Unixファイル記述子は小さなint値であり、opencreatなどの関数によって返され、readwrite、に渡されます。 closeなど。

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

より近代的なシステムではより高い制限がありますが、主に慣性から外れて、同じ一般的なスキームを維持しています。

18
Keith Thompson