オペレーティングシステムの内部動作に関する知識があまりないため、Linuxで開いているファイルと実行中のプロセスの最大数に制限があるのはなぜですか?
誰かが私を理解するのを助けることができればそれを感謝します。
これは主に歴史的な理由によるものです。古いLinuxメインフレームでは、多くのユーザーがメインフレームのリソースに接続して使用していました。もちろん、制限する必要があり、ファイルハンドルやプロセスなどの操作はカーネルに組み込まれているため、そこで制限されていました。 fork bomb のような攻撃を制限するのにも役立ちます。プロセス制限を使用したフォーム爆弾に対する防御が示されています here 。
また、fork bombがしようとするのと同様に、暴走フォークとファイルのオープンを許可しないことにより、複雑なサービスとデーモンをチェックし続けるのに役立ちます。
また、使用可能なRAMの量やCPU、32ビットカウンターが参照できる量が多いという事実(32ビットカウンターでカウントできるのは4294967296エントリのみ) 、しかし、そのような制限は、プログラマやシステム管理者が通常設定する制限をはるかに上回っています。とにかく、4294967296プロセスがあるずっと前から、マシンはおそらく計画どおりに、または別のリソースが不足してロックアップし始めたときに、おそらくリブートされていました。
Titan を584 TiBのメモリで実行しない限り(Linuxはスーパーコンピューター上で1つのインスタンスとして実行できないため、そうしないでしょう)、おそらくすぐにこのプロセス制限に達することはありません。それでも、共有メモリがないと仮定すると、平均的なプロセスには約146KBのメモリしかありません。
人生とLinuxの両方で、ほとんどすべてに制限があります。制限が非常に高く、心配する価値がない場合もあれば、低すぎる場合、怠zyなプログラマーが勝手に設定する場合、またはハードウェアの制限によって設定される場合もあります。
プログラマが住所などのフィールドで許可される最大文字数などの決定を行うと、任意の制限が発生します。必要に応じてメモリを動的に割り当てるよりも、任意の制限を設定する方がはるかに簡単です。使用可能なすべてのメモリを単純な入力フィールドに割り当てる必要はありませんが、重要な可能性のある他のメモリを入力で上書きすることはできません。開いているファイルとプロセスの場合、任意の制限があるか、利用可能なメモリによって制限される場合があります。後者の場合、制限に近づくと悪いことが起こり始め、システムがハングする可能性があります。そのため、それが起こる前に制限が作用するのは良いことです。時々、メモリまたはディスク容量に応じて起動時に任意の制限が決定される場合があり、通常はかなりインテリジェントですが、それでも任意です-誰かがパフォーマンスが耐えられないか危険になる場所を決め、その状況を避けるために制限を設定します。
次に、整数や文字のサイズなど、ハードウェアによって設定される制限があります。 32ビットシステムの場合、整数の最大サイズ(符号なしの場合は4,294,967,295、符号付きの場合はその半分)によって設定される制限があります。
プロセスの場合、/ proc/sys/kernel/pid_maxは許可される最大pidであるため、これはいつでも実行できるプロセス数のハード制限です。ただし、メモリの制限は通常、それよりもずっと前に作用します。
マシン全体で開いているファイルの上限については、/ proc/sys/fs/file-maxがハード制限です。これはマシンのメモリ量に基づいているため、変化します。カーネルはこれを次のように設定します。
n = (mempages * (PAGE_SIZE / 1024)) / 10;
files_stat.max_files = max_t(unsigned long, n, NR_FILE);
1 MBのRAMごとに約100になります。
プロセスごとの制限は異なります。 ulimitはこれらを定義します。