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


32

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

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


追加されたタグ:bash linux kernel system-resources
ワーナー

回答:


28

file-maxカーネルレベルで適用される最大ファイル記述子(FD)です。これは、増加することなくすべてのプロセスを超えることはできません。ulimit未満であることができるプロセスレベルで適用されますfile-max

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

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


ulimitを使用して設定されたユーザーごとの制限はすべてのユーザーに対して同じであるという私の理解は正しいですか?ユーザーごとに異なる値を使用する方法はありますか?
オリバー

はい、設定はグローバルにもユーザーごとにも設定できます。
ワーナー

あなたの投稿が正しい場合、これは真実ではありません。これはユーザーxyによって生成されるプロセスごとであり、これは/etc/sysctl.confで定義されているファイルシステムの最大値によって制限されます
-Jeredepp

3
ulimit制限はなく、プロセスごと、ユーザーごとではありません!unix.stackexchange.com/questions/55319/を
Tonin

@Tonin-はい、この答えは間違っています。
ニモ

11

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ループ(stdout、stdin、およびstderr)に到達する前に3つのオープンファイル記述子があったため

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


だから、あなたは正しい。制限はユーザ単位プロセスごとのベースでありませんので、Warnerの応答は、この意味で間違っている@
filipenf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.