webentwicklung-frage-antwort-db.com.de

Speicherverlust des Docker-Daemons aufgrund von Protokollen eines lang laufenden Prozesses

Ich habe das folgende Setup:

  1. Perl-Dienst, der in einem Container ausgeführt wird und sich bei STDERR abmeldet
  2. logspout um diese Logs zur Archivierung an einen Remote-Server zu senden

in einer 600 MB RAM Maschine.

Ich schneide auch die Protokolle regelmäßig ab:

/var/lib/docker/containers/CID/CID-json.log

wie vorgeschlagen hier um 100% Disk-Szenarien zu vermeiden.

Problem

Der Docker-Daemon beginnt mit einem geringen Speicherbedarf von anfänglich 1% und steigt nach 2 Tagen des Containers langsam auf 40% an. 

Referenz

In this issue und this issue wurde über das Speicherleck des Docker-Daemons gesprochen. Aber beide sind jetzt geschlossen und sagen, dass sie bei einem Commit zusammengelegt wurden. Ich führe das neueste Hauptversion von Docker (Docker-Version 1.4.0, Build 4595d4f) aus, hat jedoch immer noch ein monoton zunehmendes Speicherverwendungsproblem.

BEARBEITEN: Ich habe dieses Experiment durchgeführt: Führen Sie einfach einen Bash-Prozess im Container aus, drucken Sie viele Zeilen nach STDERR, und die Speicherauslastung des Docker-Daemon-Prozesses beschleunigt sich sehr schnell

Führt das Andockfenster einige log-Pufferungen durch und gibt den Speicher auch dann nicht frei, wenn die darunterliegende Protokolldatei (/var/lib/docker/containers/CID/CID-json.log) gelöscht wird?

Es gibt anscheinend keine Möglichkeit die Protokolle zu löschen. Wird dieses Commit dieses Problem für lange laufende Aufgaben lösen? 

Ich weiß nicht, warum die Speicherauslastung von Docker Daemon ständig steigt. Wie kann ich dieses Problem debuggen?

21
alpha_cod

Es gibt immer noch ein Problem mit Speicherlecks bei Protokollen: https://github.com/docker/docker/issues/9139

2
mhsmith

Dies ist möglicherweise nicht das, wonach Sie suchen, aber ich führe normalerweise einen Cron-Job aus, um meine Container nach einer bestimmten Zeit täglich neu zu starten. Dies stellt sicher, dass der Container immer über genügend RAM verfügt, und ich schränke im Allgemeinen die maximale RAM-Nutzung des Containers ein, während er erstellt wird. 

Für den Neustart und die Bereitstellung von Daten sind Container nur wenige Sekunden erforderlich. Wenn Sie keinen Hochverfügbarkeitsdienst ausführen und sich einige Sekunden Ausfallzeit leisten können, sollten Sie den Container neu starten (vorausgesetzt, Sie verfügen über keine permanenten Volumes). 

Wenn Sie jedoch eine Lösung für Ihr Problem finden, teilen Sie uns dies bitte mit.

0
Sohail