今、私は次の方法を知っています。
- プロセスごとに開かれたファイル制限を見つけます。
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
私はこれが主に歴史的な理由によると思います。
int
Unixファイル記述子は、などの関数によって返され、背中に渡される小さな値です。open
creat
read
write
close
少なくとも初期バージョンのUnixでは、ファイル記述子は単に固定サイズのプロセス固有の構造配列へのインデックスであり、各構造には開かれたファイルに関する情報が含まれていました。私の記憶が正しい場合、一部の初期システムではこのテーブルのサイズを約20個に制限していました。
より近代的なシステムはより高い限界を有するが、一般に慣性から逸脱し、同じ一般的なスキームを維持する。