
今のところ、次の方法を知っています:
- プロセスごとのオープンファイルの制限を見つける:
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
などの関数によって返され、 、、などに渡される小さな値です。open
creat
read
write
close
少なくとも Unix の初期バージョンでは、ファイル記述子は、プロセスごとに固定サイズの構造体配列へのインデックスにすぎず、各構造体には開いているファイルに関する情報が含まれていました。私の記憶が正しければ、初期のシステムの中には、このテーブルのサイズを 20 程度に制限していたものもありました。
より現代的なシステムでは制限は高くなっていますが、主に慣性により、同じ基本スキームが維持されています。