4 votes

Fuite de mémoire Docker ?

J'utilise Docker 0.9.0

uname -a
Linux 3.11.0-18-generic #32-Ubuntu SMP Tue Feb 18 21:11:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

J'ai 40 conteneurs qui fonctionnent en même temps. Chaque conteneur est assez simple - il exécute un extrait de code dans un processus Node. Une boucle infinie attend que d'autres bouts de code s'exécutent dans Node.

De temps en temps, je marque ces conteneurs pour qu'ils soient tués, et je démarre un autre conteneur pour prendre sa place. J'ai rencontré des erreurs de mémoire. Parfois, tout se bloque et Docker signale "cannot allocate memory for new container", et parfois il y a simplement un dépassement de délai sur le socket.

Le rapport constant des chats meminfo et les appels "free". Ces rapports suggèrent que j'ai abondance de mémoire inutilisée.

La commande

ps --sort -rss -eo rss,pid,command | grep docker

sous différents scénarios m'indique qu'au fur et à mesure que de nouveaux conteneurs remplacent d'anciens conteneurs, la mémoire de la taille de l'ensemble résident augmente sans cesse. Si j'arrête le service tel quel et que j'attends une heure, ce phénomène diminue quelque peu mais n'atteint jamais le niveau précédent. Par exemple, il ne reviendra jamais au niveau auquel les 40 conteneurs d'origine ont été créés.

pmap `pidof docker`

Indique que toutes les entrées sont [anon] - d'après ce que j'ai compris, il s'agit de la mémoire réservée par malloc.

Le point de crash est ~2GB alloué au daemon Docker RSS, en hausse par rapport à ~40M lorsqu'il était neuf.

Je ne suis pas certain qu'il s'agisse d'un autre bug de Docker ou d'une fuite de mémoire.


Comment cela pourrait-il conduire à une erreur de mémoire si l'on considère que gratuit fait état de 4,5G inutilisées ?


Il n'y a pas de swap sur mon système.

DÉTAIL IMPORTANT : Docker ne parvient pas à supprimer les conteneurs tués via l'API distante en raison d'une erreur du pilote AUFS. Pour cette raison, je compte sur un cron externe pour supprimer les conteneurs arrêtés via le CLI.

4voto

Gabriel Talavera Points 1357

Vous pouvez utiliser valgrind pour trouver des problèmes liés à la mémoire :

Utilisation :

valgrind --tool=memcheck program_name (/sbin/docker or wharever the path to docker is)
valgrind --leak-check=yes program_name

Exemple :

valgrind --leak-check=yes /sbin/httpd

Vérifier les lignes contenant définitivement perdue o probablement perdue pour confirmer l'existence d'une fuite de mémoire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X