it-swarm.com.de

Docker Ignoriert limits.conf (versucht, den Fehler "zu viele offene Dateien" zu lösen)

Ich verwende einen Webserver, der viele tausend gleichzeitige Web-Socket-Verbindungen verarbeitet. Um dies zu ermöglichen, unter Debian Linux (mein Basis-Image ist google/debian: wheezy, läuft auf GCE), wobei die Standardanzahl offener Dateien auf 1000 festgelegt ist, lege ich normalerweise nur die gewünschte Anzahl (64.000) fest. . 

Das klappt großartig, nur dass ich, als ich meine Anwendung andockte und implementierte, herausfand, dass das Docker die Limit-Definitionen ignoriert. Ich habe Folgendes versucht (alle auf dem Host-Computer, nicht auf dem Container selbst):

MAX=64000
Sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
Sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
Sudo bash -c "echo \"ulimit -c $MAX\" >>  /etc/profile"
ulimit -c $MAX

Nach einigen Recherchen fand ich heraus, dass die Leute ein ähnliches Problem auf diese Weise lösen konnten:

Sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"

und starten Sie den Andockdienst neu. 

Alle oben genannten Probleme schlagen jedoch fehl: Ich erhalte die Fehlermeldung "zu viele geöffnete Dateien", wenn meine App im Container ausgeführt wird (die folgenden Schritte ohne Docker lösen das Problem). 

Ich habe versucht, ulimit -a innerhalb des Containers auszuführen, um eine Anzeige zu erhalten, ob das ulimit-Setup funktioniert hat, aber es wird eine Fehlermeldung ausgegeben, dass ulimit keine ausführbare Datei ist, die Teil des PATH ist. 

Jemand ist auf dieses Thema gestoßen und/oder kann einen Weg vorschlagen, um Docker dazu zu bringen, die Grenzen zu erkennen.

15
orcaman

Ich konnte dieses Problem mit der folgenden Konfiguration beheben:

Ich habe Ubuntu 14.04 Linux für die Docker-Maschine und die Host-Maschine verwendet.

Auf dem HostRechner müssen Sie:

  • aktualisieren Sie die Datei /etc/security/limits.conf wie folgt: * - nofile 64000 
  • füge zu deiner /etc/sysctl.conf hinzu: fs.file-max = 64000 
  • starten Sie sysctl neu: Sudo sysctl -p 
10
Eran Chetzroni

Sie können das Limit als Argument übergeben, während Sie den Container ausführen. Auf diese Weise müssen Sie die Grenzen des Host nicht ändern und dem Container zu viel Strom verleihen. Hier ist, wie:

docker run --ulimit nofile=5000:5000 <image-tag>
3
mtyurt

Mit Docker-Compose können Sie ulimits konfigurieren.

https://docs.docker.com/compose/compose-file/#ulimits

Sie können weiche/harte Grenzwerte als Zuordnung hinzufügen.

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

Obwohl dies nicht ideal ist, können Sie Container mit einer privilegierten Option ausführen (meistens für eine schnelle, nicht optimale Lösung für eine Dev-Umgebung, nicht empfehlenswert, wenn Sicherheit ein Problem darstellt). 

docker run --privileged

Bitte sehen Sie:

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

1
lvolmar