it-swarm.com.de

Wie kann man ein globales Nofile-Limit festlegen, um den Fehler "viele offene Dateien" zu vermeiden?

Ich habe einen Websocket-Dienst. Es ist ein Fehler, der Fehler hat: "zu viele offene Dateien", aber ich habe das System konfiguriert:

/etc/security/limits.conf
*               soft    nofile          65000
*               hard    nofile          65000

/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000

ulimit -n
//output 6500

Ich denke, mein System ist richtig konfiguriert.

Mein Service wird von einem Supervisor verwaltet. Möglicherweise gibt es Supervisor-Grenzwerte.

Überprüfen Sie den Prozessstart durch den Supervisor:

cat /proc/815/limits
Max open files            1024                 4096                 files 

Überprüfen Sie den manuellen Start des Prozesses:

cat /proc/900/limits
Max open files            65000                 65000                 files 

Der Grund ist Supervisor Management Serivce verwendet. Wenn ich Supervisor neu starte und den untergeordneten Prozess neu starte, ist "Max Open Files" in Ordnung (65000), aber falsch (1024), wenn der System-Supervisor automatisch neu gestartet wird. 

Kann der Supervisor-Startwert zu hoch sein und die Systemkonfiguration funktioniert nicht, wenn der Supervisor startet?

edit:

system: Ubuntu 12.04 64bit

Es ist kein Supervisor-Problem. Alle automatischen Autostarts nach dem Neustart des Systems werden nicht vom System konfiguriert (max. Geöffnete Dateien = 1024).

update

Vielleicht ist das Problem:

Jetzt ist die Frage, wie man ein globales Nofile-Limit einstellt, weil ich kein Nofile-Limit in jedem Upstart-Skript festlegen möchte, das ich brauche.

25
leiyonglin

Ich hatte das gleiche Problem. Obwohl ulimit -Sn mein neues Limit anzeigt, wurden bei der Ausführung von supervisorctl restart all und cating der proc-Dateien die neuen Grenzwerte nicht angezeigt.

Das Problem ist, dass supervisord noch die ursprünglichen Grenzen hat. Daher haben alle von ihr erstellten untergeordneten Prozesse immer noch die ursprünglichen Grenzen.

Die Lösung besteht also darin, supervisord zu beenden und neu zu starten.

9
Luqmaan

Dieses Problem wurde behoben, indem die Grenzwerte für alle Benutzer in der Datei festgelegt wurden:

$ cat /etc/security/limits.d/custom.conf
* hard nofile 550000
* soft nofile 550000

Den SERVER nach dem Einstellen der Grenzwerte neu starten.

SEHR WICHTIG: Der /etc/security/limits.d/-Ordner enthält benutzerspezifische Beschränkungen. In meinem Fall hatte hadoop 2 (cloudera) Grenzen. Diese benutzerspezifischen Grenzwerte überschreiben die globalen Grenzwerte. Wenn Ihre Grenzwerte nicht angewendet werden, müssen Sie die benutzerspezifischen Grenzwerte im Ordner /etc/security/limits.d/ und in der Datei /etc/security/limits.conf überprüfen.

VORSICHT: Das Festlegen benutzerspezifischer Grenzwerte ist in allen Fällen der Weg. Das Setzen des globalen (*) Limits sollte vermieden werden. In meinem Fall war dies eine isolierte Umgebung und es war nur notwendig, um Probleme mit Dateibegrenzungen aus meinem Experiment zu entfernen. 

Ich hoffe, das erspart jemandem ein paar Haare - da ich zu viel Zeit damit verbracht habe, meine Haare Stück für Stück herauszuziehen!

9
OkezieE

Für alle müden Googler: Sie suchen möglicherweise nach der Einstellung minfds in dem Supervisor config . Diese Einstellung scheint sowohl für den Supervisord-Prozess als auch für die Kinder wirksam zu sein. Ich hatte eine Reihe anderer Strategien, einschließlich des Startens eines Shell-Skripts, das die Grenzen vor der Ausführung des eigentlichen Programms festlegt, aber dies war das einzige, was funktionierte.

5
Dan

Bearbeiten Sie /etc/sysctl.conf und passen Sie die Grenzwerte global an Beispiel:

Erzwingt die Beschränkung auf 100000 Dateien. 

vi /etc/sysctl.conf

Anhängen:

fs.file-max = 100000

Speichern und schließen Sie die Datei. Benutzer müssen sich abmelden und erneut anmelden, damit die Änderungen wirksam werden, oder geben den folgenden Befehl ein:

sysctl -p
4
Giovanni Silva

Sie finden Ihr Limit bei:

 cat /proc/sys/fs/file-max

oder sysctl -a | grep file

Ändern Sie es in/proc/sys/fs/file-max oder mit:

sysctl -w fs.file-max=100000
2
Dimitrios

luqmaans Antwort war das Ticket für mich, abgesehen von einer kleinen Einschränkung: Die Wildcard * gilt nicht für root in Ubuntu (wie in den Kommentaren von limits.conf beschrieben).

Sie müssen das Limit für root explizit festlegen, wenn supervisord als root-Benutzer gestartet wird:

vi /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535
2
lextoumbourou

Können Sie auf diese Weise das Limit für den Service festlegen:

add: LimitNOFILE=65536 in: /etc/systemd/system/{NameofService}.service