J'ai un conteneur docker qui exécute mon service REST écrit en python Flask. Je cours le conteneur using VirtualBox sur OSx.Pourquoi le docker plante-t-il en cas d'utilisation intensive de la mémoire?
Ce sont les statistiques de la mémoire sur OSx au moment où le conteneur est lancé:
Donc, j'ai ~ 3 Go de mémoire libre. Alors je lance mon conteneur avec limite de mémoire de 2 Go
docker run -d -m 2g --name mycontainer -p 5000:5000 foobar
J'envoie ~ 100 demandes REST au service en cours d'exécution sur le conteneur en même temps d'exécution docker stats
.
Éventuellement, le conteneur docker se bloque.
Je colle sous les données de docker stats
juste avant le plantage du conteneur.
crash 1: Lors de l'exécution de 100 demandes différentes (Container tombe en panne presque instantanément
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
27ee4ed4f98a 99.27% 256.9 MB/2.147 GB 11.96% 163.2 kB/7.958 kB 107.4 MB/0 B
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
27ee4ed4f98a 99.77% 324 MB/2.147 GB 15.09% 163.2 kB/7.958 kB 107.4 MB/0 B
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
Accident 2. Lors de l'exécution 1 demande 100 fois (accidents de conteneurs après environ 30)
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 79.00% 891.5 MB/2.147 GB 41.52% 12.13 MB/429.8 kB 2.379 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 85.83% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.071 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 85.83% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.071 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.01% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.81 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.01% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.81 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.28% 892.2 MB/2.147 GB 41.55% 12.13 MB/429.8 kB 4.508 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.28% 892.2 MB/2.147 GB 41.55% 12.13 MB/429.8 kB 4.508 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
docker ps -a
indique ce qui suit après l'accident
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41fc484677fb foobar "python service.py" 7 minutes ago Exited (137) 2 minutes ago mycontainer
dmesg en cours d'exécution montre plusieurs des erreurs de mémoire:
➜ ~ docker exec -it mycontainer dmesg | grep "Out of memory"
Out of memory: Kill process 2006 (python) score 872 or sacrifice child
Out of memory: Kill process 2496 (python) score 873 or sacrifice child
Out of memory: Kill process 2807 (python) score 879 or sacrifice child
Out of memory: Kill process 3101 (python) score 875 or sacrifice child
Out of memory: Kill process 5393 (python) score 868 or sacrifice child
Out of memory: Kill process 5647 (python) score 868 or sacrifice child
Out of memory: Kill process 5926 (python) score 877 or sacrifice child
Out of memory: Kill process 6328 (python) score 873 or sacrifice child
Out of memory: Kill process 7923 (python) score 872 or sacrifice child
Out of memory: Kill process 10183 (python) score 873 or sacrifice child
Question
Comment puis-je éviter les accidents comme ceux-ci?
Ceci est juste sur ma machine locale mais finalement je prévois de déployer ce conteneur à la production. Quelles approches dois-je suivre pour me protéger contre les accidents? Devrais-je supporter plusieurs clones de ce conteneur derrière un équilibreur de charge Nginx?
En production, je prévois d'exécuter un seul conteneur sur un seul serveur. Si je lance un conteneur unique sur un serveur et que je n'exécute rien d'autre sur ce serveur, le conteneur pourra-t-il utiliser toutes les ressources informatiques disponibles?
Le noyau Linux a l'habitude de tuer des processus s'il manque de mémoire. Cherchez les raisons pour lesquelles elle le fait. –
Si vous utilisez un seul conteneur sur un seul serveur, pourquoi utilisez-vous un contsiner? – dirn