Praktische maximale Anzahl offener Dateideskriptoren (ulimit -n) für ein System mit hohem Volumen

76

Wir haben kürzlich begonnen, unsere Anwendung zu testen und festgestellt, dass die Dateideskriptoren nach etwa 24 Stunden aufgebraucht sind.

Wir führen RHEL 5 auf einem Dell 1955 aus:

CPU: 2 x Dual Core 2,66 GHz 4 MB 5150/1333 FSB RAM: 8 GB RAM Festplatte: 2 x 160 GB 2,5-Zoll-SATA-Festplatten

Ich habe das Dateideskriptor-Limit überprüft und es wurde auf 1024 festgelegt. Angesichts der Tatsache, dass unsere Anwendung möglicherweise über 1000 eingehende Verbindungen sowie 1000 ausgehende Verbindungen verfügt, scheint dies recht niedrig zu sein. Ganz zu schweigen von den tatsächlichen Dateien, die geöffnet werden müssen.

Mein erster Gedanke war, den Parameter ulimit -n nur um einige Zehnerpotenzen zu erhöhen und dann den Test erneut auszuführen, aber ich wollte mögliche Konsequenzen einer zu hohen Einstellung dieser Variablen kennen.

Gibt es Best Practices, um dies zu ändern, außer herauszufinden, wie viele Dateideskriptoren unsere Software theoretisch öffnen kann?

Kevin
quelle

Antworten:

73

Diese Einschränkungen stammten aus einer Zeit, in der mehrere "normale" Benutzer (keine Apps) den Server gemeinsam nutzten, und wir brauchten Möglichkeiten, um sie vor der Verwendung zu vieler Ressourcen zu schützen.

Sie sind für Hochleistungsserver sehr niedrig, und wir setzen sie im Allgemeinen auf eine sehr hohe Anzahl. (24k oder so) Wenn Sie höhere Zahlen benötigen, müssen Sie auch die Option sysctl file-max ändern (im Allgemeinen auf 40k unter Ubuntu und 70k unter Rhel beschränkt).

Ulimit einstellen:

# ulimit -n 99999

Sysctl max Dateien:

#sysctl -w fs.file-max=100000

Außerdem müssen Sie möglicherweise überprüfen, ob Ihre Anwendung ein Speicher- / Dateideskriptorleck aufweist. Verwenden Sie lsof, um zu sehen, ob alle geöffneten Elemente gültig sind oder nicht. Versuchen Sie nicht, Ihr System so zu ändern, dass Anwendungsfehler umgangen werden.

sucuri
quelle
1
@sucuri Danke. Wir sind definitiv besorgt über Ressourcenlecks, aber das scheint nicht der Fall zu sein. Wir haben sowohl lsof als auch netstat beobachtet und obwohl die Zahlen hoch sind, wachsen sie nicht weiter, sie dehnen sich aus und ziehen sich zusammen. Ich gehe davon aus, dass bei einem Leck die Anzahl der offenen Sockets oder Deskriptoren im Laufe der Zeit weiter zunehmen wird.
Kevin
2
Das ulimitLimit ist nicht pro Benutzer, sondern pro Prozess! Siehe unix.stackexchange.com/questions/55319/… Und die fs.file-maxEinstellung gilt für den gesamten Server (also alle Prozesse zusammen).
Tonin
15

Man konnte immer nur

cat /proc/sys/fs/file-nr

Während der Situation mit hoher Auslastung, um zu sehen, wie viele Dateideskriptoren verwendet werden.

Was das Maximum betrifft - es hängt nur davon ab, was Sie tun.

Ben Lessani - Sonassi
quelle
Hier dachte ich 143000 war gut genug, als der obige Befehl mir zeigte 8288 0 793377!
Sridhar Sarnobat
6

Wenn es sich bei den Dateideskriptoren um TCP-Sockets usw. handelt, besteht die Gefahr, dass Sie viel Speicher für die Socket-Puffer und andere Kernel-Objekte verbrauchen. Dieser Speicher kann nicht ausgetauscht werden.

Ansonsten aber nein, prinzipiell sollte es kein Problem geben. Konsultieren Sie die Kernel-Dokumentation, um herauszufinden, wie viel Kernel-Speicher verwendet wird, und / oder testen Sie ihn.

Wir betreiben Datenbankserver mit offenen ~ 10k-Dateideskriptoren (meistens auf echten Disc-Dateien) ohne größere Probleme, aber sie sind 64-Bit-Server und haben eine Menge RAM.

Die ulimit-Einstellung ist pro Prozess festgelegt, es gibt jedoch auch eine systemweite Beschränkung (32 KB, denke ich standardmäßig).

MarkR
quelle
2

Ich persönlich kenne keine Best Practices. Es ist etwas subjektiv, abhängig von der Systemfunktion.

Denken Sie daran, dass es sich bei 1024, die Sie sehen, um ein Benutzerlimit und nicht um ein systemweites Limit handelt. Überlegen Sie, wie viele Anwendungen Sie auf diesem System ausführen. Ist das der einzige? Tut der Benutzer, der diese Anwendung ausführt, noch etwas? (IE haben Sie Menschen mit diesem Konto zum Anmelden und Ausführen von Skripten, die möglicherweise weglaufen?)

Da die Box nur diese eine Anwendung ausführt und das Konto, auf dem diese Anwendung ausgeführt wird, nur für diesen Zweck ist, sehe ich keinen Nachteil darin, Ihr Limit zu erhöhen, wie Sie vorschlagen. Wenn es sich um ein internes Entwicklerteam handelt, würde ich sie um ihre Meinung bitten. Wenn es von einem Drittanbieter stammt, gelten möglicherweise spezielle Anforderungen oder Empfehlungen.

Grahamux
quelle
@ Abrahamux Das System ist für diese Anwendung reserviert, und der Benutzer, der die Anwendung ausführt, führt nur diese Anwendung aus. Ich bin Teil des hauseigenen Entwicklerteams, also keine Hilfe.
Kevin
Das Limit ist nicht pro Benutzer, sondern pro Prozess. Siehe unix.stackexchange.com/questions/55319/…
Tonin
1

Dies scheint mir eine der Fragen zu sein, die am besten mit "In einer Entwicklungsumgebung testen" beantwortet werden können. Ich erinnere mich, dass Sun vor Jahren nervös geworden ist, als Sie sich damit angelegt haben, aber nicht so nervös. Das Limit war zu der Zeit auch 1024, also bin ich ein wenig überrascht zu sehen, dass es jetzt dasselbe für Linux ist, es scheint, als sollte es höher sein.

Ich fand den folgenden Link informativ, als ich nach Antworten auf Ihre Frage suchte: http://www.netadmintools.com/art295.html

Und dies auch: https://stackoverflow.com/questions/1212925/on-linux-set-maximum-open-files-to-unlimited-possible

Kyle Hodgson
quelle