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


Ich stelle fest, dass auf einem neuen CentOS-Image, das ich gerade von EC2 hochgefahren habe, der Ulimit-Standardwert 1024 geöffnete Dateien ist, aber / proc / sys / fs / file-max auf 761,408 gesetzt ist und ich frage mich, wie diese beiden Grenzwerte funktionieren zusammen. Ich nehme an, dass ulimit -n eine Beschränkung der Anzahl der Dateideskriptoren pro Benutzer ist, während / proc / sys / fs / file-max systemweit ist? Wenn das der Fall ist, sagen Sie, dass ich mich zweimal als derselbe Benutzer angemeldet habe - hat jeder eingeloggte Benutzer eine 1024 Grenze für die Anzahl der offenen Dateien oder ist es eine Grenze von 1024 kombinierten offenen Dateien zwischen jedem dieser eingeloggten - in Benutzern?

Und gibt es einen großen Einfluss auf die Leistung, wenn Sie Ihre maximalen Dateideskriptoren auf eine sehr hohe Zahl setzen, wenn Ihr System nie sehr viele Dateien öffnet?


30
2018-03-15 16:48


Ursprung


Tags hinzugefügt: bash linux kernel system-resources - Warner


Antworten:


file-max ist der maximale Dateideskriptor (FD), der auf einer Kernel-Ebene erzwungen wird, der nicht von allen Prozessen übertroffen werden kann, ohne zu erhöhen. Das ulimit wird auf einer Prozessebene erzwungen, die weniger als die sein kann file-max.

Es gibt kein Leistungseinflussrisiko durch Erhöhung file-max. Moderne Distributionen haben den maximalen FD-Wert ziemlich hoch gesetzt, während sie in der Vergangenheit eine Neukompilierung und Modifikation des Kernels erforderten, um die 1024 zu erhöhen. Ich würde systemweit nur dann wachsen, wenn Sie ein technisches Bedürfnis haben.

Die pro-Prozess-Konfiguration muss häufig angepasst werden, um einen bestimmten Daemon entweder als Datenbank oder als Webserver zu bedienen. Wenn Sie das Limit vollständig entfernen, könnte dieser Daemon möglicherweise alle verfügbaren Systemressourcen ausschöpfen. Dies bedeutet, dass Sie das Problem nur durch Drücken der Reset-Taste oder durch Aus- und wieder Einschalten beheben können. Natürlich führt jede dieser Dateien zu einer Beschädigung offener Dateien.


24
2018-03-15 16:51



Ist mein Verständnis richtig, dass die per Ulimit gesetzten Benutzerlimits 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 pro Benutzer festgelegt werden. - Warner
Wenn ich deine Post richtig mache, ist das nicht wahr. Es ist pro Prozess, der von Benutzer xy erzeugt wird, und dies ist durch das Dateisystem-Maximum begrenzt, das in /etc/sysctl.conf definiert ist - Jeredepp
Das ulimit Limit ist nicht pro Benutzer, sondern pro Prozess! Sehen unix.stackexchange.com/questions/55319/... - Tonin
Überarbeitet basierend auf Ihrem Feedback. Vielen Dank. - Warner


Die Einschränkung von ulimit ist pro eindeutigen Benutzer. So wäre Benutzer1 unabhängig von der Anzahl der geloggten oder laufenden Prozesse auf 1024 beschränkt. Es ist kombiniert.

Ich bin mir 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 Einschränkung pro Prozess ist, ist die akzeptierte Antwort (AFAIK) falsch.

Was ich meine ist, 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.

Zum Beispiel:

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 3 offene Dateideskriptoren vor dem Erreichen der While-Schleife (stdout, stdin und stderr) vorhanden waren

Tut mir leid, wenn ich völlig falsch liege oder die Antwort falsch verstanden habe.


10
2017-10-03 00:30



Also hast du recht. @ Warners Antwort ist in diesem Sinne falsch, da das Limit auf einer pro-Prozess-Basis und nicht pro Benutzer liegt - filipenf