今、私は次の方法を知っています:
ulimit -n
lsof | wc -l
cat /proc/sys/fs/file-max
私の質問は、Linuxで開くことができるファイルに制限があるのはなぜですか?
その理由は、オペレーティングシステムは開いている各ファイルを管理するためにメモリを必要とし、メモリは限られたリソースです-特に組み込みシステムでは。
Rootユーザーとして、プロセスごと(ulimit -n
経由)およびシステムごと(echo 800000 > /proc/sys/fs/file-max
など)の最大オープンファイル数を変更できます。
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
それは主に歴史的な理由によると思います。
Unixファイル記述子は小さなint
値であり、open
やcreat
などの関数によって返され、read
、write
、に渡されます。 close
など。
少なくともUnixの初期のバージョンでは、ファイル記述子は構造の固定サイズのプロセスごとの配列への単なるインデックスであり、各構造には開いているファイルに関する情報が含まれていました。私が正しく思い出すと、一部の初期のシステムではこのテーブルのサイズが20程度に制限されていました。
より近代的なシステムではより高い制限がありますが、主に慣性から外れて、同じ一般的なスキームを維持しています。