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.