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


Wir haben vor Kurzem mit dem Testen unserer Anwendung begonnen und festgestellt, dass nach 24 Stunden keine Dateideskriptoren mehr zur Verfügung standen.

Wir betreiben RHEL 5 auf einem Dell 1955:

CPU: 2 x Dual Core 2.66GHz 4MB 5150 / 1333FSB RAM: 8 GB RAM HDD: 2 x 160 GB 2,5 "SATA Festplatten

Ich überprüfte das Datei-Deskriptor-Limit und es wurde auf 1024 gesetzt. Wenn man bedenkt, dass unsere Anwendung möglicherweise etwa 1000 eingehende Verbindungen sowie 1000 ausgehende Verbindungen haben könnte, scheint dies ziemlich niedrig zu sein. Ganz zu schweigen von irgendwelchen tatsächlichen Dateien, die geöffnet werden müssen.

Mein erster Gedanke war, den ulimit -n-Parameter nur um einige Größenordnungen zu erhöhen und dann den Test erneut auszuführen, aber ich wollte wissen, welche Auswirkungen diese Variable möglicherweise zu hoch hat.

Gibt es Best Practices für die Einstellung dieser anderen als herauszufinden, wie viele Dateideskriptoren unsere Software theoretisch öffnen kann?


69
2017-07-31 22:35


Ursprung




Antworten:


Diese Grenzwerte stammen aus einer Zeit, in der sich mehrere "normale" Benutzer (nicht Apps) den Server teilen und wir Wege suchten, sie davor zu schützen, zu viele Ressourcen zu verwenden.

Sie sind sehr niedrig für Hochleistungsserver 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 (normalerweise auf 40k auf ubuntu und 70k auf rhel beschränkt).

Einstellen von ulimit:

# ulimit -n 99999

Sysctl Max-Dateien:

#sysctl -w fs.file-max=100000

Außerdem und sehr wichtig, müssen Sie möglicherweise überprüfen, ob Ihre Anwendung ein Speicher / Datei-Deskriptor-Leck hat. Verwenden Sie lsof, um alles zu sehen, was geöffnet ist, um zu sehen, ob sie gültig sind oder nicht. Versuchen Sie nicht, Ihr System zu ändern, um Anwendungsfehler zu umgehen.


70
2017-08-01 13:08



@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 während die Zahlen hoch sind, wachsen sie nicht weiter, sie erweitern und kontrahieren. Ich erwarte, dass im Falle eines Lecks die Anzahl offener Sockets oder Deskriptoren mit der Zeit weiter wachsen würde. - Kevin
Das ulimit Limit ist nicht pro Benutzer, sondern pro Prozess! Sehen unix.stackexchange.com/questions/55319/...  Und das fs.file-max Einstellung ist für den Server als Ganzes (also alle Prozesse zusammen). - Tonin


Du könntest immer nur

cat /proc/sys/fs/file-nr

Während der "High-Load" -Situation, um zu sehen, wie viele Dateideskriptoren verwendet werden.

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


13
2018-05-18 12:22



Hier dachte ich 143000 war gut genug, als der obige Befehl mich zeigte 8288 0 793377! - Sridhar-Sarnobat


Wenn die Dateideskriptoren tcp-Sockets usw. sind, riskieren Sie, eine große Menge an Speicher für die Socket-Puffer und andere Kernel-Objekte zu verbrauchen; Dieser Speicher ist nicht austauschbar.

Aber sonst, nein, im Prinzip sollte es kein Problem geben. Sehen Sie in der Kernel-Dokumentation nach, um herauszufinden, wie viel Kernel-Speicher verwendet wird, und / oder testen Sie es.

Wir führen Datenbankserver mit offenen 10k Dateideskriptoren (meistens auf echten Disk-Dateien) ohne ein großes Problem, aber sie sind 64-Bit und haben eine Menge RAM.

Die ulimit Einstellung ist per-process, aber es gibt auch ein systemweites Limit (32k denke ich standardmäßig)


6
2017-08-01 12:27





Mir sind keine Best Practices bekannt. Es ist etwas subjektiv, abhängig von der Systemfunktion.

Denken Sie daran, dass es sich bei 1024 um ein benutzerdefiniertes Limit und nicht um ein systemweites Limit handelt. Berücksichtigen Sie, wie viele Anwendungen auf diesem System ausgeführt werden. Ist das der einzige? Läuft der Benutzer, der diese Anwendung ausführt, noch etwas? (IE haben Sie Menschen, die dieses Konto verwenden, um sich anzumelden und Skripte auszuführen, die möglicherweise weglaufen könnten?)

Da die Box nur diese eine Anwendung ausführt und das Konto, auf dem die Anwendung ausgeführt wird, nur für diesen Zweck gedacht ist, sehe ich keinen Schaden, wenn Sie Ihr Limit erhöhen, wie Sie vorschlagen. Wenn es ein Inhouse-Entwicklerteam ist, würde ich nach ihrer Meinung fragen. Wenn es von einem Drittanbieter stammt, haben sie möglicherweise bestimmte Anforderungen oder Empfehlungen.


2
2017-07-31 22:53



@Grahamux Das System ist dieser Anwendung zugewiesen und der Benutzer, der die Anwendung ausführt, führt diese Anwendung nur aus. Ich bin Teil des Inhouse-Entwicklerteams, also keine Hilfe. - Kevin
Das Limit ist nicht pro Benutzer, sondern pro Prozess. Sehen unix.stackexchange.com/questions/55319/... - Tonin


Dies scheint mir eine dieser Fragen zu sein, die am besten mit "Testen Sie es in einer Entwicklungsumgebung" beantwortet wird. Ich erinnere mich, dass Sun vor Jahren nervös wurde, als du damit durcheinander kamst, aber nicht so nervös. Es war zu der Zeit auch 1024, also bin ich ein wenig überrascht zu sehen, dass es jetzt für Linux dasselbe ist, scheint es höher zu sein.

Ich habe folgenden Link gefunden, als ich nach Antworten auf deine Frage gegoogelt habe: http://www.netadmintools.com/art295.html

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


1
2017-08-01 00:51