Wie unterscheiden sich ulimit -n und / proc / sys / fs / file-max?

32

Ich stelle fest, dass auf einem neuen CentOS-Image, das ich gerade von EC2 aus gebootet habe, der Standardwert für ulimit 1024 offene Dateien ist, aber / proc / sys / fs / file-max auf 761.408 festgelegt ist, und ich frage mich, wie diese beiden Grenzwerte funktionieren zusammen. Ich vermute, dass ulimit -n ein Benutzerlimit für die Anzahl der Dateideskriptoren ist, während / proc / sys / fs / file-max systemweit gilt. Wenn dies der Fall ist, sagen wir, ich habe mich zweimal als derselbe Benutzer angemeldet - hat jeder angemeldete Benutzer ein Limit von 1024 für die Anzahl der geöffneten Dateien oder ist es ein Limit von 1024 kombinierten geöffneten Dateien zwischen jedem dieser angemeldeten Benutzer? bei Usern?

Und hat das Festlegen der maximalen Dateideskriptoren auf einen sehr hohen Wert erhebliche Auswirkungen auf die Leistung, wenn Ihr System nicht immer sehr viele Dateien öffnet?

bantisch
quelle
Hinzugefügte Tags: bash linux kernel system-resources
Warner

Antworten:

28

file-maxist die maximale Anzahl von Dateideskriptoren (File Descriptors, FD), die auf Kernel-Ebene erzwungen wird und die nicht von allen Prozessen ohne Erhöhung überschritten werden kann. Das ulimitwird auf einer Prozessebene erzwungen, die kleiner als das sein kann file-max.

Es besteht kein Risiko für Leistungseinbußen durch Erhöhung file-max. In modernen Distributionen ist die maximale FD ziemlich hoch eingestellt, wohingegen in der Vergangenheit eine Neukompilierung und Änderung des Kernels erforderlich war, um die Zahl nach 1024 zu erhöhen. Eine systemweite Erhöhung würde ich nur durchführen, wenn Sie einen technischen Bedarf haben.

Die Konfiguration pro Prozess muss häufig optimiert werden, um einen bestimmten Daemon zu bedienen, sei es eine Datenbank oder ein Webserver. Wenn Sie die Beschränkung vollständig aufheben, kann dieser Dämon möglicherweise alle verfügbaren Systemressourcen erschöpfen. Dies bedeutet, dass Sie das Problem nur durch Drücken der Reset-Taste oder durch Aus- und Wiedereinschalten beheben können. Beides führt wahrscheinlich zur Beschädigung aller geöffneten Dateien.

Warner
quelle
Ist mein Verständnis korrekt, dass die mit ulimit festgelegten Benutzerbegrenzungen für alle Benutzer gleich sind? Gibt es eine Möglichkeit, unterschiedliche Werte pro Benutzer zu verwenden oder nicht?
Oliver
Ja, die Einstellungen können sowohl global als auch benutzerbezogen vorgenommen werden.
Warner
Wenn ich deinen Beitrag richtig mache, ist das nicht wahr. Es wird pro Prozess vom Benutzer xy erzeugt und dies wird durch das in /etc/sysctl.conf
Jeredepp
3
Das ulimitLimit ist nicht pro Benutzer, sondern pro Prozess! Siehe unix.stackexchange.com/questions/55319/…
Tonin
@ Tonin - Ja, diese Antwort ist einfach falsch.
Nemo
11

Die Beschränkung von ulimit gilt für jeden einzelnen Benutzer. Daher ist user1, unabhängig davon, wie oft angemeldet oder welche Prozesse ausgeführt werden, auf 1024 beschränkt. Es ist kombiniert.

Ich bin nicht sicher, ob ich die Bedeutung dieses Satzes vollständig verstehe (Englisch ist nicht meine Muttersprache). Wenn dieser Satz bedeutet, dass die ulimit-Konfiguration für Dateideskriptoren keine prozessbezogene Einschränkung darstellt, ist die akzeptierte Antwort (AFAIK) falsch.

Ich meine, wenn ein Benutzer 4 Prozesse gestartet hat und die ulimit-Konfiguration für FDs 1024 ist, kann jeder Prozess 1024 FDs öffnen. Der Benutzer ist nicht auf 1024 FDs beschränkt, sondern auf die Prozesse, die von diesem Benutzer gestartet werden.

Beispielsweise:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

Hier ein Perl-Beispiel, bei dem wir das Limit erreichen (es ist ein Pro-Prozess-Limit):

#!/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 ++;
}

Ergebnis:

FDs: 1021 Too many open files at ./test.pl line 8.

1021, weil es 3 offene Dateideskriptoren gab, bevor die while-Schleife erreicht wurde (stdout, stdin und stderr)

Entschuldigung, wenn ich völlig falsch liege oder die Antwort falsch verstanden habe.

Gänsemann
quelle
Also hast du recht. @ Warners Antwort ist in diesem Sinne falsch, da das Limit pro Prozess und nicht pro Benutzer gilt
filipenf