Begrenzung der Anzahl der Dateideskriptoren


34

Ich versuche zu installieren 389-ds, und es gibt mir diese Warnung:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

Ich verstehe Dateideskriptoren, aber ich verstehe keine weichen und harten Grenzen.

Wenn ich renne cat /proc/sys/fs/file-max, komme ich zurück 590432. Dies sollte bedeuten, dass ich bis zu 590432-Dateien öffnen kann (dh bis zu 590432-Dateideskriptoren haben kann.

Aber wenn ich renne ulimit, gibt es mir unterschiedliche Ergebnisse:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

Aber ulimitwoher kommt das Hard / Soft-Limit und in welcher Beziehung stehen sie zu der Nummer, unter der es gespeichert ist /proc/sys/fs/file-max?

Antworten:


39

Nach der Kernel - Dokumentation , /proc/sys/file-maxist die maximale, total, globale Anzahl von Dateideskriptoren die Kernel vor Ersticken zuteilen wird. Dies ist das Kernel-Limit, nicht das Limit Ihres aktuellen Benutzers. Sie können also 590432 öffnen, sofern Sie alleine auf einem inaktiven System sind (Einzelbenutzermodus, keine laufenden Dämonen).

Beachten Sie, dass die Dokumentation nicht mehr aktuell ist: Die Datei wurde proc/sys/fs/file-maxfür eine lange Zeit. Vielen Dank an Martin Jambon für diesen Hinweis.

Der Unterschied zwischen weichen und harten Grenzen wird hier auf SE beantwortet . Sie können als normaler Benutzer ein Soft-Limit erhöhen oder senken, sofern Sie das Hard-Limit nicht überschreiten. Sie können auch ein hartes Limit senken (aber Sie können es für diesen Prozess nicht erneut erhöhen). Als Superuser können Sie sowohl Hard- als auch Soft-Limits erhöhen und senken. Das Dual-Limit-Schema wird zum Erzwingen von Systemrichtlinien verwendet, ermöglicht aber auch normalen Benutzern, temporäre Limits für sich selbst festzulegen und diese später zu ändern.

Beachten Sie, dass Sie eine Rückmeldung erhalten, wenn Sie versuchen, ein hartes Limit unter das weiche Limit zu senken (und Sie sind nicht der Superuser) EINVAL(ungültiges Argument).

In Ihrem speziellen Fall ulimit(das ist dasselbe wie ulimit -Sf) gilt also, dass Sie keine weiche Grenze für die Größe der von der Shell und ihren Unterprozessen geschriebenen Dateien haben . (Das ist wahrscheinlich in den meisten Fällen eine gute Idee)

Bei Ihrem anderen Aufruf wird ulimit -Hndas -nLimit (maximale Anzahl offener Dateideskriptoren) und nicht das -fLimit angegeben, weshalb das weiche Limit höher als das harte Limit zu sein scheint. Wenn Sie eingeben, erhalten ulimit -HfSie auch "unbegrenzt".


14
Unter Linux 4.4.0 lautet der maximale Dateipfad /proc/sys/fs/file-max.
Martin Jambon

Ist das Hard-Limit ulimit -Hn auf die Beschränkung des Systems auf zugewiesene Dateideskriptorfunktionen ausgerichtet?
Webwoman

2
@Webman: Nein, das tut es nicht. ulimitwirkt sich nur auf die Grenzwerte für den aktuellen Prozess aus . Die Grenzen des aktuellen Prozesses werden auch untergeordneten Prozessen überlassen, aber jeder Prozess hat eine eigene Anzahl. Zum Beispiel ulimit -Hn 10können mit nur 10 Dateideskriptoren gleichzeitig geöffnet sein. Jeder untergeordnete Prozess, den Sie erstellen, kann auch nur bis zu 10 Dateideskriptoren enthalten. Nur der Superuser kann ein einmal festgelegtes Limit erhöhen. Wenn Sie einen Wert zu niedrig einstellen, besteht Ihre einzige Option möglicherweise darin, den Shell-Prozess zu beenden und einen neuen zu starten.
Alexios

0

Der Systemaufruf "select" ist eine der vielen schrecklichen Entscheidungen, die beim Entwurf von Unix getroffen wurden.

Es sollte vor 20 Jahren verboten worden sein und dann könnten wir jetzt die Möglichkeit haben, ohne Probleme unbegrenzte Datei-Handler zu verwenden.

Sie können die Anzahl der Dateideskriptoren mit der Kernelkonfiguration leicht erhöhen und ulimit ABER denken Sie daran, dass Ihr Programm instabil wird (Speicherbeschädigung) und fehlschlägt, wenn eine Bibliothek den Systemaufruf "select" verwendet.

Select kann nur Dateideskriptoren von 0 bis 1023 verarbeiten. Wenn Sie einen Wert mit einem höheren Wert eingeben, wird dieser zufällig in Ihrem Speicher abgelegt und der Select wiederholt den Deskriptor niemals als funktionierend. Leider verwenden viele Bibliotheken select.


Ihr Kommentar ist eine nützliche Warnung, aber es wäre weitaus nützlicher gewesen, wenn Sie die fd_set(3)Manpage zitiert hätten, und dass das Limit von stammt , anstatt einen Scherzton zu nehmen FD_SETSIZE. Und das Beste wäre ein Vorschlag für einen Ersatzanruf wie poll(3)in dieser Antwort gewesen
Davor Cubranic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.