Comment détecter une fuite de mémoire dans Ubuntu

Découvrez comment détecter et résoudre les fuites de mémoire sur Ubuntu grâce à des outils et commandes simples, garantissant le bon fonctionnement de votre système.
Il existe plusieurs raisons pour lesquelles une fuite de mémoire peut se produire sur Ubuntu, mais heureusement, il est évident lorsqu'elles se produisent. Un code bogué est souvent la plus grande raison, car les programmeurs n'ont peut-être pas eu l'occasion de s'assurer que la mémoire qui n'est plus nécessaire soit libérée. Si vous avez installé des paquets instables ou compilé du code à partir de sources, alors vous pourriez avoir affaire à des fuites de mémoire pour cette raison. Vous commencerez probablement à les remarquer lorsque des paquets d'application commencent à se plaindre de manquer de mémoire alors que vous avez suffisamment de RAM physique installée.
Si vous êtes préoccupé par une fuite de mémoire, essayez de taper free
à plusieurs reprises dans un terminal. Si vous commencez à voir une augmentation rapide de l'utilisation de la RAM, vous avez déjà détecté une fuite de mémoire. Si vous recevez une erreur indiquant quelque chose comme bash: Not enough Memory
tout en effectuant cela et que vous n'avez ouvert qu'un terminal ou même juste une console virtuelle, alors vous êtes presque sans conteste confronté à une fuite de mémoire. Certaines fuites de mémoire peuvent être un peu plus subtiles, mais Ubuntu et ses différentes variantes disposent d'outils et de paquets qui peuvent vous aider à les détecter.
Détecter les Fuites de Mémoire sur Ubuntu
Puisque les outils utilisés pour détecter les fuites de mémoire sont principalement basés autour de l'invite de commande CLI, il n'a pas d'importance sur quelle version d'Ubuntu vous les exécutez. Ceux-ci devraient fonctionner correctement dans un terminal Unity sur Ubuntu normal, à partir d'une console virtuelle sur Ubuntu Server, à partir d'un lxterm
sur Lubuntu, d'un Konsole
sur Kubuntu, ou même à l'intérieur d'Xfce sur Xubuntu. Essayez d'effectuer une tâche simple comme sudo -s
et tapez votre mot de passe pour commencer.
Cela devrait vous donner un shell root si cela est effectué correctement, mais peut provoquer une erreur de mémoire si vous travaillez avec une fuite qui a déjà trop progressé. Si vous êtes effectivement capable d'accéder à un shell root, essayez de taper echo 3 > /proc/sys/m/drop_caches
, appuyez sur la touche entrée, puis tapez exit
. Essayez de relancer free
ou free -m
pour voir si cela a aidé à libérer de la mémoire.
Certaines programmeurs soutiennent qu'il n'y a aucune raison de forcer le noyau à éliminer ses caches, car ceux-ci devraient être vidés et donc récupérés dès que de la mémoire physique supplémentaire est nécessaire. Cependant, bien que forcer l'évacuation de ces caches nuise aux performances du système, gardez à l'esprit qu'il ne s'agit que d'un test. Une fois que vous avez redémarré le système, le noyau Linux devrait à nouveau assembler les caches de mémoire comme ils l'étaient à l'origine.
Quelques personnes ont suggéré d'ajouter la ligne sync; sudo echo 3 > /proc/sys/vm/drop_caches
à un script que cron exécute de manière cohérente, mais cela contredit l'objectif même du caching mémoire. La mémoire libre en elle-même n'est que de la RAM inutilisée, et cela signifie que des données doivent être chargées à partir de dispositifs de stockage électromécaniques ou NAND beaucoup plus lents. Peu importe à quelle vitesse ces dispositifs sont, ils ne sont pas aussi rapides que la RAM, ce qui signifie que tout en corrigeant les fuites de mémoire, vous ne devriez pas vraiment perturber le système de cache une fois que vous l'avez réglé sur les paramètres optimaux.
Si vous avez décidé que vous avez effectivement une fuite de mémoire cohérente qui se produit périodiquement lors de l'utilisation de votre machine et qu'elle ne peut pas être spécifiquement identifiée, mais que vous avez toujours accès à la CLI, essayez d'exécuter la commande top
. Cela devrait vous donner une liste des processus en cours d'exécution.
Si Ubuntu vous donne une erreur inhabituelle à propos de top
, essayez d'émettre busybox top
à la place afin d'accéder à une version encore plus simple de ce programme. Une fois que vous avez une liste, regardez la colonne %MEM
ou une colonne similaire pour voir quelles applications sont assignées à la plus grande mémoire. Bien que vous puissiez noter le PID et émettre une commande kill
au numéro exact du PID, cela ne fera que forcer la fermeture de l'application. La mémoire qu'elles utilisent pourrait néanmoins ne pas être libérée après cela, bien que cela vaille bien sûr la peine d'essayer.
Si vous trouvez une application qui utilise une grande quantité de mémoire, appuyez sur q
pour quitter, puis essayez kill ####
avec le numéro du PID de l'écran précédent. Les processus système ne devraient pas être tués de cette manière, ni quoi que ce soit pour lequel vous avez un travail non sauvegardé. Pensez à ceci de manière similaire à tuer quelque chose avec la liste de tâches Ctrl+Alt+Del
, que vous pouvez également utiliser pour ce même processus.
Lorsque vous avez trouvé un programme qui subit de manière cohérente ce problème, vous pouvez le configurer pour empêcher ce comportement à l'avenir. Chaque programme individuel aura bien sûr besoin d'un recours différent, ce qui dépasse la tâche de simplement détecter des fuites de mémoire.
Si vous ne vous limitez pas à résoudre des problèmes d'applications, mais...
Si vous travaillez également avec du code, il existe quelques autres ressources à votre disposition. Ubuntu et ses dérivés vous offrent les routines C membarrier, memusage et memusagestat pour la programmation.
Utilisez simplement man membarrier, man memusage ou man memusagestat pour consulter les pages du Manuel du Programmeur Linux sur ces routines importantes. Si des mises à jour apparaissent dans les versions futures des bibliothèques à mesure que de nouvelles versions d'Ubuntu sont publiées, les changements seront toujours décrits ici.
Si vous avez besoin de contenu graphique, memusagestat offre même la possibilité de sauvegarder une représentation graphique de l'utilisation de la mémoire dans un fichier PNG. Cela en fait une fonctionnalité attrayante pour les auteurs d'outils, car elle peut être utilisée pour créer des applications qui vérifient régulièrement les fuites de mémoire.
Vous souhaiterez peut-être également installer memprof, qui est un outil pour profiler l'utilisation de la mémoire afin de vous aider à détecter les fuites de mémoire. Il génère un profil sur la quantité de mémoire que chaque fonction d'un programme que vous écrivez alloue. Il peut également scanner la mémoire existante pour trouver des blocs qui ont été alloués, mais qui n'ont plus de références valables. Il le fait en pré-chargeant une bibliothèque pour remplacer les fonctionnalités d'allocation de mémoire de la bibliothèque C standard.
Si vous prévoyez de l'utiliser, assurez-vous de retirer la ligne include memprof du début de votre code avant de le publier. Cela est utilisé pour s'assurer que vous n'avez pas de fuites, mais cela ne devrait pas devenir une dépendance si vous empaquetez votre code et le publiez dans un dépôt.
Maintenant que tu as fini de lire Comment détecter une fuite de mémoire dans Ubuntu, nous t'invitons à explorer davantage la catégorie Linux. Tu y trouveras d'autres articles intéressants qui élargiront tes connaissances et te tiendront informé. Ne cesse pas de lire et de découvrir plus!
Laisser un commentaire