web-dev-qa-db-ja.com

ulimit -nと/ proc / sys / fs / file-maxの違いは何ですか?

EC2から起動したばかりの新しいCentOSイメージでは、ulimitのデフォルトは1024のオープンファイルであることがわかりますが、/ proc/sys/fs/file-maxは761,408に設定されており、これら2つの制限がどのように機能するのか疑問に思っています一緒。/proc/sys/fs/file-maxがシステム全体であるのに対し、ulimit -nはユーザーごとのファイル記述子数の制限だと思いますか?その場合、同じユーザーとして2回ログインしたとしましょう-ログインしているユーザーごとに、開いているファイルの数に1024の制限がありますか?ユーザーで?

また、システムが非常に多くのファイルを開かない場合、最大ファイル記述子を非常に大きな数に設定すると、パフォーマンスに大きな影響がありますか?

33
bantic

file-maxは、カーネルレベルで適用される最大のファイル記述子(FD)であり、増加せずにすべてのプロセスを超えることはできません。 ulimitはプロセスレベルで適用され、file-maxよりも小さい場合があります。

file-maxを増やすことによるパフォーマンスへの影響リスクはありません。最近のディストリビューションでは、最大FDセットがかなり高くなっていますが、以前はカーネルの再コンパイルと修正が1024を超える必要がありました。技術的な必要がない限り、システム全体で増やすことはしません。

多くの場合、プロセスごとの構成は、データベースまたはWebサーバーのいずれかである特定のデーモンを提供するために調整する必要があります。制限を完全に削除すると、そのデーモンが使用可能なすべてのシステムリソースを使い果たす可能性があります。つまり、リセットボタンを押すか、電源を切って入れ直すことを除いて、問題を修正することはできません。もちろん、これらのいずれかが原因で、開いているファイルが破損する可能性があります。

31
Warner

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))

私が完全に間違っているか、答えを誤解している場合は申し訳ありません。

12
Gooseman