Collegamenti a questo nice post su stressin g Utilizzo della memoria del contenitore. Ecco il riassunto, modificato un po 'di lavorare per finestra mobile invece di LXC generico:
contenitore lancio con un limite di memoria:
$ sudo docker -m 512M -it ubuntu /bin/bash
root# apt-get update && apt-get install -y build-essential
Creare un file foo.c
all'interno del contenitore con il seguente
#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);
}
Compilare il file
gcc -o foo foo.c
Aprire una nuova ter minal per monitorare l'utilizzo della memoria del contenitore:
$ 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
Avviare il consumo di memoria nel contenitore
$ ./foo
Ora guardare il vostro contenitore di massimo fuori. Nota: quando si esaurisce la memoria, l'avvio di malloc fallisce, ma in caso contrario il contenitore viene lasciato inutilizzato. Normalmente il software all'interno del contenitore si arresta in modo anomalo a causa dei malfunzionamenti dei mallocs, ma il software resiliente continuerà a funzionare
Nota finale: il flag di Docker -m non conta swap e ram separatamente. Se si utilizza -m 512M
, alcuni di questi 512 verranno scambiati, non RAM. Se si desidera che la RAM solo è necessario utilizzare direttamente le opzioni LXC (il che significa che sarà necessario eseguire finestra mobile con il driver esecuzione LXC invece di libcontainer)
# 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
C'è una notevole differenza tra l'utilizzo di swap come parte del totale e non - con swap il programma foo sopra raggiunge ~ 450M velocemente e poi consuma lentamente il resto, mentre con solo RAM salta immediatamente a 511M per me.Con lo scambio il consumo di memoria del contenitore è segnato a ~ 60M non appena inserisco il container - questo è fondamentalmente lo swap che viene conteggiato come "utilizzo". Senza scambio il mio utilizzo della memoria è < 10M quando entro il contenitore
A follow-up di questo, sto vedendo alcune differenze interessanti tra le app dockerized su un server virtualizzato contro una scatola di metallo grezzo. Ad esempio, OOM ucciderà Java in un server ubuntu virtualizzato che esegue il servizio Java nel contenitore. Tuttavia, su metallo - Java sta rispettando i limiti di memoria impostati tramite finestra mobile. [Non so ancora abbastanza sui dettagli di implementazione tra i due per buone conclusioni, volevo solo condividere] – nerdwaller