Les Crash-Devs d'un Passionné

Connaitre la consommation de son application python (dans un container)

/Catégorie/python

Temps de lecture : 3 minutes

Il existe une librairie

psutil
(à installer) qui permet de collecter des informations sur la consommation mémoire et CPU de votre application python

docker exec -it my-container poetry run python -c 'import psutil;print(f"{psutil.cpu_freq().current} MHz")'

Et pour la mémoire consommée

docker exec -it my-container poetry run python -c 'import psutil;print(f"{psutil.virtual_memory().active / 1000 / 1000} Mo")'

Cependant les informations collecter ne sont pas correctes, car par défaut cette lib connecte la récupération des infos sur

/proc
de l'hôte. Il faut donc mettre à jour cette information
PROCFS_PATH
. L'éditeur indique que cette solution comporte des limitations, examinons pourquoi.

Docker utilises cgroups pour mettre en place des limitations de ressource et isoler le processus par rapport aux autres. On retrouve ces informations dans

/sys/fs/cgroup

Les outils comme

top
ne font pas référence au cgroup, il va aller chercher les informations de l'hôte dans
/proc
(qui n'est pas compatible cgroup). Et par extension
psutil
va récolter ces informations à partir de l'OS donc
/proc

L'approche cgroup et

/proc
ne sont pas compatibles entre eux, c'est pour cela que
psutils
indique que la modification de
PROCFS_PATH
n'est pas entièrement compatible https://psutil.readthedocs.io/en/latest/index.html#psutil.PROCFS_PATH

Sinon il est possible d'accéder à ces informations avec les commandes docker

clipboard
Copier le code
1
2
3
docker stats my-container
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
3d68c2bfc68f my-container 0.28% 88.38MiB / 128MiB 69.04% 220kB / 80.8kB 29.7MB / 15.2MB 13

Ou alors pour extraire uniquement la mémoire utilisée sans mise à jour temps réel de l'information

clipboard
Copier le code
1
docker stats --no-stream --format "{{.MemUsage}}" my-container

Si on souhaite l'extraire depuis l'API docker il suffit d'installer la librairie

docker
et d'utiliser ce script

clipboard
Copier le code
1
2
3
4
5
6
7
import docker
import pprint
client = docker.DockerClient(base_url='unix:///home/david/.docker/desktop/docker.sock')
for containers in client.containers.list():
 results = containers.stats(decode=None, stream=False)
 pprint.pprint(results) # Plenty of data
 print(f'{round(results["memory_stats"]["usage"] / 1000 / 1000)} Mo') # 157 Mo

En résumé, n'utilisez pas

psutils
dans vos containers mais plutôt l'API de
docker
si vous en avez besoin dans votre application. Si toutefois ces informations sont jetables (par exemple pour dimensionner correctement votre serveur) utilisez la commande CLI
docker stats