J'ai un système (Ubuntu) avec de nombreux processus et un (ou plusieurs) a une fuite de mémoire. Existe-t-il un bon moyen de trouver le processus qui présente la fuite? Certains processus sont des machines virtuelles Java, d'autres non. Certains sont cultivés à la maison, certains sont open source.
Vous pouvez exécuter la commande top
(pour exécuter de manière non interactive, tapez top -b -n 1
). Pour voir les applications qui perdent de la mémoire, consultez les colonnes suivantes:
si le programme fuit sur une longue période, top peut ne pas être pratique. J'écrirais un simple script Shell qui ajoute le résultat de "ps aux" à un fichier toutes les X secondes, selon le temps qu'il faut pour fuir des quantités importantes de mémoire. Quelque chose comme:
while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done
En plus du haut, vous pouvez utiliser le Moniteur système (Système - Administration - Moniteur système, puis sélectionnez l'onglet Processus). Sélectionnez Affichage - Tous les processus, allez dans Edition - Préférences et activez la colonne Mémoire virtuelle. Trier soit par cette colonne, soit par colonne Mémoire
Je suggère l'utilisation de htop, comme meilleure alternative au top.
Tâche difficile. Je suggérerais normalement de saisir un débogueur/profileur de mémoire comme Valgrind et d'exécuter les programmes un par un dedans. Tôt ou tard, vous trouverez le programme qui fuit et pouvez le signaler au développeur ou le réparer vous-même.
Si vous ne pouvez pas le faire de manière déductive, considérez le modèle de débogage Signal Flare: augmentez la quantité de mémoire allouée par un processus par un facteur de dix. Exécutez ensuite votre programme.
Si la quantité de mémoire perdue est la même, ce processus n'est pas à l'origine de la fuite; restaurer le processus et apporter la même modification au processus suivant.
Lorsque vous frappez le processus responsable, vous verrez la taille de votre saut de fuite de mémoire (le "signal flare"). Vous pouvez le réduire encore davantage en augmentant de manière sélective la taille d'allocation d'instructions distinctes dans ce processus.
Comme suggéré, la voie à suivre est Valgrind. Il s'agit d'un profileur qui vérifie de nombreux aspects des performances d'exécution de votre application, y compris l'utilisation de la mémoire.
L'exécution de votre application via Valgrind vous permettra de vérifier si vous oubliez de libérer de la mémoire allouée avec malloc, si vous libérez deux fois la même mémoire, etc.