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



Essayez Notre Instrument Pour Éliminer Les Problèmes

Il y a plusieurs raisons pour lesquelles une fuite de mémoire peut se produire sur Ubuntu, mais heureusement, c'est évident quand elles se produisent. Le code de bogue est souvent la principale raison, car les programmeurs n'ont peut-être pas eu l'occasion de vérifier pour s'assurer que la mémoire qui n'est plus nécessaire est libérée. Si vous avez installé des packages instables ou compilé du code à partir des sources, vous avez peut-être affaire à des fuites de mémoire pour cette raison. Vous allez probablement commencer à les remarquer, car les packages d’applications logicielles commencent à se plaindre du manque de mémoire lorsque la RAM physique est plus que suffisante.



Si vous êtes préoccupé par une fuite de mémoire, essayez de taper gratuitement à plusieurs reprises dans un terminal. Si vous commencez soudainement à voir l'utilisation de la RAM augmenter rapidement, c'est que vous avez déjà détecté une fuite de mémoire. Si vous recevez une erreur qui lit quelque chose comme bash: pas assez de mémoire en faisant cela et que vous n'avez rien d'autre qu'un terminal ou même juste une console virtuelle ouverte, alors vous en avez presque incontestablement affaire. Certaines fuites de mémoire peuvent être un peu plus subtiles, mais Ubuntu et ses différents dérivés proposent des outils et des packages qui peuvent vous aider à les détecter.



Détection des fuites de mémoire dans Ubuntu

Étant donné que les outils utilisés pour détecter les fuites de mémoire sont principalement basés sur l'invite CLI, peu importe la version d'Ubuntu sur laquelle vous les exécutez. Ceux-ci devraient fonctionner correctement à l'intérieur d'un terminal Unity dans Ubuntu ordinaire, à partir d'une console virtuelle dans Ubuntu Server, d'un lxterm dans Lubuntu, d'un Konsole dans Kubuntu ou même à l'intérieur de Xfce dans Xubuntu. Essayez d'effectuer une tâche simple comme sudo -s et tapez votre mot de passe pour commencer.



Cela devrait vous permettre d'obtenir un shell racine s'il est exécuté correctement, mais peut provoquer une erreur de mémoire si vous travaillez avec une fuite qui est déjà allée trop loin. Si vous parvenez effectivement à accéder à un shell racine, essayez de taper echo 3> / proc / sys / m / drop_caches, appuyez sur la touche Entrée, puis tapez exit. Essayez à nouveau d'exécuter free ou free -m pour voir si cela a contribué à libérer de la mémoire.

Certains programmeurs soutiennent qu’il n’est pas utile de forcer le noyau à abandonner ses caches, car ils doivent être vidés et ainsi récupérés dès qu’une mémoire physique supplémentaire est nécessaire. Cependant, même si le vidage forcé de ces caches nuira 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 doit à nouveau assembler les caches de mémoire comme ils l’étaient au départ.

Quelques personnes ont suggéré d'ajouter la synchronisation de ligne; sudo echo 3> / proc / sys / vm / drop_caches à un script que cron exécute de manière cohérente, mais cela va à l'encontre de l'objectif de la mise en cache mémoire en premier lieu. La mémoire libre elle-même n'est que de la RAM inutilisée, ce qui signifie que les données doivent être chargées à partir de beaucoup plus lentementélectromécanique ou périphériques de stockage NAND. Quelle que soit la vitesse de ces appareils, ils ne sont pas aussi rapides que la RAM, ce qui signifie que même si vous devez corriger les fuites de mémoire, vous ne devriez pas réellement altérer le système de cache une fois que vous l'avez réglé sur le paramètre optimal.



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 réduite spécifiquement, mais que vous avez toujours un accès CLI, essayez d'exécuter la commande top. Cela devrait vous donner une liste des processus en cours.

Si Ubuntu vous donne une erreur inhabituelle sur top, essayez plutôt de lancer busybox top afin d'accéder à une version encore plus simple de ce programme. Une fois que vous avez une liste, regardez la colonne% MEM ou similaire pour voir quelles applications sont affectées le plus de mémoire. Bien que vous puissiez noter le PID et émettre une commande kill au numéro exact du PID, cela forcera simplement l'application à se fermer. La mémoire qu'ils utilisent peut ne pas être libérée une fois que vous avez fait cela, même si cela vaut bien sûr une chance.

Si vous trouvez une application qui utilise une grande quantité de mémoire, appuyez sur q pour quitter, puis essayez de tuer #### avec le numéro PID de l'écran précédent. Les processus système ne doivent pas être tués de cette façon, ni tout ce que vous avez non enregistré ne doit fonctionner. Pensez à cela de la même manière que tuer quelque chose avec la liste de tâches Ctrl + Alt + Suppr, que vous pouvez également utiliser pour ce même processus.

Lorsque vous avez trouvé un programme auquel cela se produit régulièrement, vous pouvez le configurer pour empêcher ce comportement à l'avenir. Chaque programme individuel, bien sûr, aura besoin d'un recours différent, qui est au-delà de la simple détection des fuites de mémoire.

Si vous ne vous contentez pas de dépanner des applications, mais que vous travaillez également avec du code, vous disposez de quelques autres recours. Ubuntu et ses dérivés vous offrent les routines membarrier, memusage et memusagestat C pour la programmation.

Utilisez simplement man membarrier, man memusage ou man memusagestat pour afficher les pages du manuel du programmeur Linux sur ces routines importantes. S'il y a des mises à niveau dans les futures versions des bibliothèques au fur et à mesure de la sortie de nouvelles versions d'Ubuntu, les modifications seront toujours décrites ici.

Si vous avez besoin de contenu graphique, memusagestat offre même la possibilité d'enregistrer une représentation graphique de l'utilisation de la mémoire dans un fichier PNG. Cela en fait également une fonctionnalité intéressante pour les auteurs d'utilitaires, car elle peut être utilisée pour créer des applications qui vérifient régulièrement les fuites de mémoire.

Vous pouvez également souhaiter installer memprof, qui est un outil de profilage de l'utilisation de la mémoire afin de vous aider à trouver des fuites de mémoire. Il génère un profil concernant la quantité de mémoire allouée par chaque fonction d’un programme que vous écrivez. Il peut également analyser la mémoire existante pour trouver des blocs qui ont été alloués, mais qui ne comportent plus de références authentiques. Pour ce faire, il précharge une bibliothèque afin de 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 supprimer la ligne include memprof du début de votre code avant de le publier. Ceci est utilisé pour vous assurer qu'il n'y a pas de fuite, mais cela ne devrait pas devenir une dépendance si vous empaquetez votre code et le publiez dans un référentiel.

4 minutes de lecture