Linuxで開いているファイルの最大許容最大数


10

Linuxで開くことができるファイルの最大数を設定できる大きさに(技術的または実用的な)制限はありますか?非常に大きな数(1〜100Mなど)に構成すると、いくつかの悪影響がありますか?

ここでは、組み込みシステムではなく、サーバーの使用法を考えています。もちろん、開いているファイルを大量に使用するプログラムはメモリを消費して遅くなる可能性がありますが、制限が必要以上に大きく設定されている場合の悪影響に興味があります(たとえば、設定だけで消費されるメモリ)。


理論的には、使用可能なメモリと、各fdが1Kのメモリを消費するというアサーションに基づいて、システムが処理できるファイル記述子の数を計算できます。serverfault.com
330795

回答:


10

制限の主な理由は、過剰なメモリ消費を避けるためだと思います(開いている各ファイル記述子はカーネルメモリを使用します)。また、バグのあるアプリケーションがファイル記述子をリークし、システムリソースを消費するのを防ぐ手段としても機能します。

しかし、現代のシステムが10年前のシステムと比べて非常に多くのRAMを持っていることを考えると、今日のデフォルトはかなり低いと思います。

2011年、Linuxでのファイル記述子のデフォルトのハード制限が1024から4096引き上げられました

一部のソフトウェア(MongoDBなど)は、デフォルトの制限よりも多くのファイル記述子を使用します。MongoDBの人々は、この制限を64,000に上げることを推奨しています。rlimit_nofile特定のアプリケーションでは300,000を使用しました。

ソフト制限をデフォルト(1024)に保つ限り、ハード制限を増やすことはおそらくかなり安全です。プログラムはsetrlimit()、ソフト制限を超えて制限を上げるために呼び出す必要があり、ハード制限によって制限されます。

関連するいくつかの質問も参照してください。


6
ただし、これは実際には質問に答えていません。この質問では、ハードリミットをどれだけ高く設定できるかについて、技術的または実用的な制限があるかどうかが尋ねられました。ありますが、この回答にはまったく触れられていません。
JdeBP 2017年

約100万を超えて制限を引き上げることは不可能だと思います。カーネルでハードコードされているのではないかと思います。多くの構成を変更したにもかかわらず、これを超えることはできないからです。superuser.com/questions/1468436/...
パベル・コマロフ

3

通常、影響は観測されませんが、カーネルのIOモジュールは、これらすべてのオープンファイル記述子を処理する必要があり、キャッシュ効率にも影響を与える可能性があります。

このような制限には、ユーザー自身(または第三者)のミスからユーザーを保護するという利点があります。たとえば、無限に分岐する小さなプログラムまたはスクリプトを実行すると、最終的にulimitsの1つでブロックされ、より強力な(おそらく回復不能な)コンピューターのフリーズが防止されます。

これらの制限のいずれかを増やす正確な理由がない限り、それを避けてよく眠る必要があります。


2

技術的には、unsigned long(C Lang)の最大値、つまり4,294,967,295に制限されています。

参照:fs.hファイル

/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
  unsigned long nr_files;   /* read only */
  unsigned long nr_free_files;  /* read only */
  unsigned long max_files;    /* tunable THIS IS OUR VALUE */
};

2
これに関する参考資料はありますか?
ティム・

また、32ビットの最大値だと符号付き整数、32ビットの符号なし整数の最大値は4,294,967,295です。
Sampo

あなたは正しい、サンポ。私の間違い。
Leonard T

0

私はあなたの懸念は理解できると思いますが、おそらくLinuxは構成された(しかし使用されていないファイル記述子)のために多くのメモリを消費しません:)

過去10年間、私のキャリアの中でこのような問題を思い出せません。

よろしく。


0

静かに遅くなりますが、これは他のすべての人がこの質問の答えを得るために役立つはずです。Linuxで開くことができるファイル数の実際的な制限は、プロセスが開くことができるファイル記述子の最大数を使用してカウントすることもできます。

システムごとに制限が変更されるのを見てきました。getlimitの manページから、RLIMIT_NOFILE-1内部で制限を指定していることがわかります。

RLIMIT_NOFILE値をチェックするには、以下のステートメントを使用してタプルを取得できます

python -c "import resource; print(resource.getrlimit(resource.RLIMIT_NOFILE))"

タプルは結果を(Soflimit、hardlimit)として返します。複数のシステムで実行している私にとって、結果は以下のようになります

(1024, 1048576) # on UBUNTU linux 
(65536, 65536)  # on amazon linux 
(1024, 9223372036854775807) # on macos 

注:9223372036854775807この数値は、単に無限を意味します。これに達する前に、常に他のリソース制限に到達します。システムのハード制限を変更する必要がある場合は、カーネルパラメータを変更する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.