EC2から起動したばかりの新しいCentOSイメージでは、ulimitのデフォルトは1024のオープンファイルであることがわかりますが、/ proc/sys/fs/file-maxは761,408に設定されており、これら2つの制限がどのように機能するのか疑問に思っています一緒。/proc/sys/fs/file-maxがシステム全体であるのに対し、ulimit -nはユーザーごとのファイル記述子数の制限だと思いますか?その場合、同じユーザーとして2回ログインしたとしましょう-ログインしているユーザーごとに、開いているファイルの数に1024の制限がありますか?ユーザーで?
また、システムが非常に多くのファイルを開かない場合、最大ファイル記述子を非常に大きな数に設定すると、パフォーマンスに大きな影響がありますか?
file-max
は、カーネルレベルで適用される最大のファイル記述子(FD)であり、増加せずにすべてのプロセスを超えることはできません。 ulimit
はプロセスレベルで適用され、file-max
よりも小さい場合があります。
file-max
を増やすことによるパフォーマンスへの影響リスクはありません。最近のディストリビューションでは、最大FDセットがかなり高くなっていますが、以前はカーネルの再コンパイルと修正が1024を超える必要がありました。技術的な必要がない限り、システム全体で増やすことはしません。
多くの場合、プロセスごとの構成は、データベースまたはWebサーバーのいずれかである特定のデーモンを提供するために調整する必要があります。制限を完全に削除すると、そのデーモンが使用可能なすべてのシステムリソースを使い果たす可能性があります。つまり、リセットボタンを押すか、電源を切って入れ直すことを除いて、問題を修正することはできません。もちろん、これらのいずれかが原因で、開いているファイルが破損する可能性があります。
Ulimitの制限は、一意のユーザーごとです。したがって、user1は、ログインした回数や実行中のプロセスに関係なく、1024に制限されます。これは結合されます。
その文の意味を完全に理解しているかどうかはわかりません(英語は私の母国語ではありません)。その文がファイル記述子のulimit構成がプロセスごとの制限でないことを意味する場合、受け入れられた回答(AFAIK)は間違っています。
つまり、一部のユーザーが4つのプロセスを起動し、FDのulimit構成が1024の場合、各プロセスが1024のFDを開く可能性があります。ユーザーは1024 FDに限定されるのではなく、そのユーザーによって起動されるプロセスに限定されます。
例えば:
me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145
以下は、制限に達したPerlの例です(プロセスごとの制限です)。
#!/usr/bin/Perl
$count = 0;
@filedescriptors;
while ($count <= 1024) {
$FILE = ${count};
open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
Push(@filedescriptors, $FILE);
$count ++;
}
結果:
FDs: 1021 Too many open files at ./test.pl line 8.
1021(whileループに到達する前に3つのオープンファイル記述子があったため(stdout、stdin、stderr))
私が完全に間違っているか、答えを誤解している場合は申し訳ありません。