今、私は方法を知っています:
- プロセスごとに開くファイルの制限を見つける:
ulimit -n
- すべてのプロセスで開かれているすべてのファイルをカウントします。
lsof | wc -l
- 開いているファイルの最大許容数を取得します。
cat /proc/sys/fs/file-max
私の質問は次のとおりです。Linuxで開いているファイルに制限があるのはなぜですか?
今、私は方法を知っています:
ulimit -n
lsof | wc -l
cat /proc/sys/fs/file-max
私の質問は次のとおりです。Linuxで開いているファイルに制限があるのはなぜですか?
回答:
その理由は、オペレーティングシステムが開いている各ファイルを管理するためにメモリを必要とし、メモリが限られたリソースであるためです-特に組み込みシステムでは。
rootユーザーとして、プロセスごと(を介してulimit -n
)およびシステムごと(例えばecho 800000 > /proc/sys/fs/file-max
)に開くことができるファイルの最大数を変更できます。
/.../file-max
、メモリが消費されない限り非常に大きな値を設定できますか?
file-max
RAMサイズを10kで割った値のようです。ファイルハンドラごとに使用される実際のメモリははるかに小さくする必要があるため(サイズにstruct file
加えていくつかのドライバ依存メモリ)、これはかなり控えめな制限のようです。
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
lsof
2倍以上、など多くのファイルを報告します/dev/null
、あなたが最良の推測を試すことができます:lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
開いているファイルの重複しないカウントを取得するために使用できます。
主に歴史的な理由によるものだと思います。
Unixのファイルディスクリプタは小さいint
ように関数が返す値、open
およびcreat
、と渡されたread
、write
、close
、など。
少なくともUnixの初期のバージョンでは、ファイル記述子は単に、構造のプロセスごとの固定サイズの配列へのインデックスであり、各構造には開いているファイルに関する情報が含まれていました。正しく思い出せば、初期のシステムの中にはこのテーブルのサイズを20程度に制限していたものがありました。
最新のシステムにはより高い制限がありますが、同じ一般的なスキームを維持しており、大部分は慣性から外れています。
fileno
とfdopen
関数を考えると、それらはほぼ互換性があると思われます。
int
記述子またはFILE*
。で20を超えるファイルを開いているopen()
場合、fdopen()
失敗しますか?