Zu viele offene Dateien auf Debian

15

Ich habe einen langen Prozess bei Debian. Irgendwann tritt ein Fehler auf:

Zu viele offene Dateien.

Laufen:

ulimit -a

zeigt an:

offene Dateien (-n) 1024

Ich möchte die Anzahl der geöffneten Dateien zweimal erhöhen. Nach der Ausführung

ulimit -n 2048

Das Limit ist bis zum Ende meiner Sitzung aktiv. Dies gilt nicht für die Aufgabe.

Wie kann ich die Anzahl der geöffneten Dateien dauerhaft erhöhen?

FoxyBOA
quelle

Antworten:

12

Wenn Ihr Prozess über ein Skript gestartet wird, können Sie den Aufruf von ulimit direkt vor der Ausführung des Dämons im Skript platzieren.

Wenn Sie das ulimit für Ihren Benutzer oder für alle Benutzer erhöhen möchten, können Sie Grenzwerte festlegen, die beim pam_limitsAnmelden über angewendet werden . Diese sind eingestellt /etc/security/limits.conf. In Ihrem Fall könnten Sie Folgendes tun:

*               hard    nofile             2048

Beachten Sie, dass "hart" ein hartes Limit bezeichnet, das nicht überschritten und nicht geändert werden kann. Ein Soft-Limit kann von einem Benutzer (z. B. jemand ohne Root-Fähigkeiten) geändert werden, jedoch nicht über das Hard-Limit hinaus.

Lesen Sie die limits.conffür weitere Informationen zur Verwendung pam_limits.

Daniel Lawson
quelle
An den Grenzen conf habe ich 2 Zeilen: * soft nofile 4096 * hard nofile 8192 Die haben keine Wirkung.
FoxyBOA
Und Sie haben sich abgemeldet und wieder angemeldet, seit Sie diese getestet haben? Dies bedeutet, dass Sie sich direkt von X / GNOME / KDE usw. abmelden, wenn Sie dies auf einem lokalen Computer versuchen
Daniel Lawson,
Ja. /etc/security/limits.conf funktioniert bei mir nicht. Ich werde einen zweiten Ansatz versuchen.
FoxyBOA
3
/etc/security/limits.conf funktioniert nur für Dienste, die pam und das pam-Modul pam_limits verwenden (siehe /etc/pam.d/ für die PAM-Konfiguration jedes Dienstes und /etc/pam.d/common-* im Besonderen) . Es betrifft also alle Benutzersitzungen, die von sshd, gdm, login usw. erstellt wurden. Es betrifft nicht alle Programme, die beim Booten gestartet wurden ...
Raphaël Hertzog
Ich habe etwas in diesem Sinne gesagt, aber danke für die Klarstellung. Das OP hat nicht geklärt, ob es sich um einen Dienst oder einen Prozess handelt, den sein Benutzer ausführt.
Daniel Lawson
13

Es gibt auch ein "total max" an offenen Dateien im Kernel. Sie können die aktuelle Einstellung überprüfen mit:

cat /proc/sys/fs/file-max 

Und setzen Sie einen neuen Wert mit:

echo "104854" > /proc/sys/fs/file-max

Wenn Sie die Konfiguration zwischen den Neustarts beibehalten möchten, fügen Sie hinzu

sys.fs.file-max=104854

zu

/etc/sysctl.conf

So überprüfen Sie die aktuelle maximale Dateiverwendung:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)
rkthkr
quelle
1
Beachten Sie, dass, wenn frei zugewiesene Dateideskriptoren angezeigt werden 0, die Anzahl der zugewiesenen Dateizugriffsnummern genau der Anzahl der verwendeten Dateizugriffsnummern entspricht.
Dienstag, den
Mine zeigt einige Unzahl hier: 49152 0 18446744073709551615 . Ich verstehe nicht, warum die ersten beiden Spalten nicht die dritte addieren. Und wenn ich 1,8 Billionen Billionen zur Verfügung habe, verstehe ich nicht, wie ich sie alle verwendet habe.
mlissner
4

Wie bereits erwähnt, können Sie in /etc/security/limits.conf pro Benutzer oder Gruppe bestimmte Grenzwerte festlegen.

Hinweis: ulimit -n zeigt das weiche Limit an.

ulimit -H -n 

zeigt dir die harte Grenze.

Dies macht die Ausgabe von ulimit -a und ulimit -n ziemlich verwirrend, wenn Sie zum Beispiel die Anzahl der Dateien von 1024 auf 4096 erhöhen, da Sie die Ausgabe mit dem harten Limit erwarten würden, aber immer noch 1024 sehen, welches das weiche ist Grenze.

Denken Sie auch daran, dass diese Beschränkungen pro Anmeldung gelten. Melden Sie sich daher erneut in einer neuen Shell an und überprüfen Sie Ihre Änderungen. Erwarten Sie nicht, dass sie an vorhandene Anmeldungen weitergegeben werden.

Tom Feiner
quelle
2

Beachten Sie, dass das Setzen von ulimits in /etc/security/limits.conf nicht funktioniert, wenn Sie Ihren Prozess durch Starten-Stoppen-Daemon ausführen. Wenn Sie beispielsweise das Limit für offene Dateien für Tomcat auf 20000 erhöhen möchten, müssen Sie diese Zeilen hinzufügen, um /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Ich bin auf diesem Problem unter Debian 6.0.4 gestoßen. Für andere Prozesse sollten die gegebenen Antworten hilfreich sein.

Janning
quelle
1

Es hängt davon ab, wie Sie Ihren langfristigen Prozess starten. Wenn es beim Booten gestartet wird (über /etc/rcX.d/* Skripte), müssen Sie einen ulimit-Aufruf in Ihr Startskript einfügen, da das Standardlimit vom Kernel festgelegt wird und es nicht angepasst werden kann, ohne es neu zu kompilieren.

Using /etc/security/limits.confkönnte funktionieren, wenn Sie crones zum Beispiel mit einem Eintrag wie diesem starten:

@reboot $HOME/bin/my-program

Das sollte funktionieren, da /etc/pam.d/cron pam_limits.so aktiviert.

Raphaël Hertzog
quelle
-1

Sie können dies in /etc/security/limits.conf hinzufügen

root soft nofile 100000
root hard nofile 100000

Speichern und neu starten.

kxmp
quelle
3
Gibt es hier etwas Neues, das nicht in der akzeptierten Antwort auf diese 5-jährige Frage enthalten ist?
Andrew Schulman
-2

Ein sehr netter Befehl ist, ulimit -naber es gibt ein Problem mit zu vielen Verbindungen und zu vielen offenen Dateien:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Plaudern
quelle
Ich habe versucht, Ihre Antwort zu bereinigen, aber mir ist immer noch unklar, was Sie zu der Frage nach dem Originalposter sagen möchten. Können Sie versuchen, dies weiter aufzuräumen?
SLM
Auch dies ist die Ausgabe von ulimit -a, nicht ulimit -n.
Yvan