Links zu diesen nice post auf stressin g Speicherverbrauch des Containers. Hier ist die Zusammenfassung, modifiziert, um ein Bit für Docker statt generic LXC zu arbeiten:
Startcontainer mit einer Speichergrenze:
$ sudo docker -m 512M -it ubuntu /bin/bash
root# apt-get update && apt-get install -y build-essential
Erstellen Sie eine Datei foo.c
im Inneren des Behälters mit dem folgenden
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int i;
for (i=0; i<65536; i++) {
char *q = malloc(65536);
printf ("Malloced: %ld\n", 65536*i);
}
sleep(9999999);
}
Kompilieren Sie die Datei
gcc -o foo foo.c
Öffnen Sie ein neues ter luminale den Container Speichernutzung zu überwachen:
$ cd /sys/fs/cgroup/memory/lxc/{{containerID}}
$ while true; do echo -n "Mem Usage (mb): " && expr `cat memory.usage_in_bytes`/1024/1024; echo -n "Mem+swap Usage (mb): " && expr `cat memory.limit_in_bytes`/1024/1024; sleep 1; done
den Speicherverbrauch in der
$ ./foo
Jetzt ist Ihr Behälter max achten Behälter starten. Hinweis: Wenn die Speicherkapazität von malloc nicht mehr ausreicht, wird der Container nicht ausgeführt. Normalerweise wird die Software innerhalb des Containers aufgrund fehlender mallocs abstürzen, aber Software, die resilient ist, wird weiter funktionieren
Endgültige Anmerkung: Docker -m Flag zählt Swap und Ram nicht separat gezählt. Wenn Sie -m 512M
verwenden, dann werden einige von diesen 512 Swap, nicht RAM. Wenn Sie möchten, das RAM nur müssen Sie LXC Optionen direkt verwenden (was bedeutet, müssen Sie Docker mit der LXC Ausführung Treiber statt libcontainer laufen)
# Same as docker -m 512m
sudo docker run --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash
# Set total to equal max RAM (e.g. don't use swap)
sudo docker run --lxc-conf="lxc.cgroup.memory.max_usage_in_bytes=512M" --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash
Es ist ein bemerkenswerter Unterschied zwischen der Verwendung von Swap im Rahmen der insgesamt und nicht - mit dem foo-programm über tausch zu erreichen ~ 450M schnell und dann langsam verbraucht den rest, während mit nur RAM es springt sofort auf 511M für mich.Bei Swap wird der Speicherverbrauch des Containers bei ~ 60M markiert, sobald ich den Container betrete - das ist im Grunde der Swap, der als "Usage" gezählt wird. Ohne Swap meine Speicherauslastung ist < 10M, wenn ich in den Behälter gelangen
A Im Anschluss sehe ich einige interessante Unterschiede zwischen dockerisierten Apps auf einem virtualisierten Server gegenüber einer Bare-Metal-Box. Beispielsweise führt OOM Java auf einem virtualisierten Ubuntu-Server aus, auf dem der Java-Dienst im Container ausgeführt wird. Jedoch auf Java - Java respektiert die Speichergrenzen, die über Docker eingestellt werden. [Ich weiß noch nicht genug über Implementierungsdetails zwischen den beiden für gute Schlussfolgerungen, wollte nur teilen] – nerdwaller