Contributeur spécial au Scout APMle 29 avril 2022
Les fuites de mémoire sont l'un des pires cauchemars des développeurs.Ils peuvent facilement éliminer une application de course saine en quelques heures, voire des minutes.Il peut être difficile de détecter certaines de ces fuites car elles se développent lentement et reprennent la mémoire disponible de votre application.En plus, chaque langage de programmation gère la mémoire à sa manière unique et peut donc fuir la mémoire de différentes manières.Par conséquent, des mesures proactives pour identifier et empêcher de ces fuites se produisent est cruciale.
Python est l'une des langues les plus puissantes mais les plus simplifiées du marché actuel.Bien qu'il utilise une gamme de mesures pour s'assurer que ses applications ne fonctionnent pas dans le déficit des ressources, il n'est toujours pas complètement distant des incidents de fuite de mémoire.Dans ce guide, nous discuterons comment et pourquoi une fuite de mémoire se produit dans une application Python et comment vous pouvez le combattre.De plus, vous devriez jeter un œil au blog Scout qui peut vous aider à trouver des solutions aux fuites de mémoire Python et à d'autres problèmes similaires.
N'hésitez pas à naviguer dans le guide à l'aide de ces liens:
- Qu'est-ce qui peut conduire à une fuite de mémoire python?
- Comment empêcher une fuite de mémoire en python
- Arrêtez les fuites de mémoire Python avec Scout APM aujourd'hui
Qu'est-ce qui peut conduire à une fuite de mémoire python?
Un pythonfuite de mémoireFait référence à une situation dans laquelle la consommation de mémoire d'une application Python continue d'augmenter au fil du temps et, finalement, aucune mémoire n'est disponible, ce qui entraîne le plan de l'application en raison d'un manque de ressources.Il ne doit pas être confondu avecballonneur de mémoire, qui est une pic soudain du graphique de consommation de mémoire qui se produit généralement en raison d'allocations de mémoire non planifiées en vrac.
Il peut y avoir plusieurs causes de fuites de mémoire Python.Jetons un coup d'œil à certains d'entre eux dans cette section.
Objets non référencés
L'une des principales causes de fuites de mémoire dans les langages de programmation est la présence d'objets non référencés dans la mémoire.Les objets non référencés sont alloués dans la mémoire, mais la référence à ces objets a été supprimée au cours du flux de contrôle.
La plupart des langages de programmation mettent en œuvre des mesures dans leurs mécanismes de collecte des ordures pour marquer et nettoyer automatiquement les objets non référencés.Cependant, ce n'est pas parfait, et pas mal d'objets sont parfois ignorés de ce processus.Par conséquent, la meilleure façon de gérer ce problème est de supprimer manuellement tous les objets auxquels vous allouez la mémoire.De cette façon, vous pouvez être sûr que votre programme efface autant de mémoire que possible et ne contribue pas à une croissance de la consommation de mémoire incontrôlée.
Cependant, vous êtes susceptible d'utiliser plusieurs bibliothèques tierces dans votre code.Vous n'avez pas de contrôle sur les normes de codage utilisées dans de telles bibliothèques, et donc elles peuvent également être la source des fuites de mémoire.
Dysfonctionnement des collectionneurs d'ordures
Dans certains cas, le mécanisme de collecte des ordures peut être défectueux et laisser des objets non référencés ou des objets à présager rester dans la mémoire plus longtemps qu'ils n'en ont besoin.Même si votre mécanisme de collecte des ordures retarde l'exécution par un certain temps mais efface toujours la mémoire, il pourrait de toute façon contribuer aux fuites de mémoire.Par conséquent, il est préférable de garder un œil sur la consommation de mémoire de votre application, même si vous êtes sûr d'avoir utilisé les meilleures conventions de gestion de la mémoire tout au long de votre code.
Comment empêcher une mémoire de mémoire en python
Maintenant que vous comprenez comment les fuites de mémoire peuvent se produire dans Python, jetons un coup d'œil à certaines des façons dont vous pouvez identifier et empêcher les fuites de mémoire dans Python.
Suivi de la performance
Bien qu'il existe de nombreuses façons d'identifier manuellement les fuites de mémoire Python, il peut être difficile de les récupérer dans des applications en direct.Vous ne pouvez pas procéder à profilage manuellement chaque application pour vérifier s'il y a une fuite de mémoire de temps en temps.C'est pourquoi vous avez besoin d'une surveillance des performances.
La surveillance des performances garde un œil sur l'utilisation des ressources de votre application et vous avertit lorsqu'il dépasse les seuils spécifiés.C’est à ce moment-là que vous savez que quelque chose est éteint dans votre application.Certains outils de surveillance des performances sont suffisamment intelligents pour apprendre le modèle dans lequel votre application consomme des ressources et informez chaque fois qu'une anomalie est détectée.Ces outils peuvent même prédire comment vos applications se comporteront dans un avenir proche.
Débogage
Une fois que vous avez détecté qu'il existe un modèle de consommation de mémoire inhabituel dans votre application, la prochaine étape à franchir consiste à déboguer votre application pour localiser la cause.Le collectionneur de ordures intégré de Python vous permet de déboguer l'utilisation de la mémoire de votre application.Vous pouvez afficher une liste d'objets dans la mémoire dont le collecteur des ordures est au courant.
Le débogage d'une application vous permet de voir comment il consomme de la mémoire tout au long de son cycle de vie.Une fois que vous avez des données à ce sujet, vous pouvez filtrer et rechercher pour trouver des objets qui ne sont pas nécessaires mais qui consomment toujours de la mémoire.Vous pouvez ensuite refacter votre code pour les supprimer et libérer immédiatement la mémoire.
Cependant, vous devez être prudent lorsque vous utilisez certains débogueurs dans Python.Si ce n'est pas utilisé correctement, les débogueurs tels quePDBPeut maintenir des références aux objets de votre application et les empêcher d'être collectées normalement.
Tracemalloc
Tracemalloc(abréviation des allocations de mémoire de trace) est l'une des meilleures fonctionnalités intégrées de Python.Il peut vous aider à retracer un objet à la source où il a été alloué dans la mémoire.Il propose également des statistiques sur la gestion globale de la mémoire de l'application.
L'une des cas d'utilisation les plus importantes de Tracemalloc est de suivre l'utilisation de la mémoire des objets individuels dans l'exécution.Vous pouvez découvrir quel objet consomme de la mémoire et identifier facilement la cause des fuites de mémoire.
Vous pouvez ensuite utiliser les capacités de traçage de Tracemalloc pour identifier l'emplacement de ces objets dans votre code et le refactor de manière appropriée pour réduire la consommation de mémoire inutile.Tracemalloc vous aide également à calculer la différence de consommation de mémoire entre deux instantanés dans l'exécution d'une application.Cette différence peut vous aider directement à identifier s'il y a une fuite de mémoire dans l'application.
Cpython
CPython est l'interprète sous-jacent utilisé pour exécuter des programmes Python.CPython a des fonctions intégrées qui garantissent de collecter des objets non référencés (via le comptage de référence) en soi et de les supprimer de la mémoire.Par conséquent, vous pouvez être assuré que les bibliothèques CPYthon feront le travail dans les coulisses pour éliminer les allocations de mémoire inutiles.
Cependant, le processus de collecte des ordures dans Python fonctionne sur les seuils et est généralement déclenché lorsqu'un nombre considérable d'objets sont dérécis sur votre programme.Cela laisse la place pour que les objets s'accumulent et provoquent des fuites de mémoire dans certaines situations.C'est pourquoi vous avez besoin des méthodes discutées ci-dessus.
Arrêtez les fuites de mémoire Python avec Scout APM aujourd'hui
Les fuites de mémoire sont l'une des plus lentes pour perdre une application saine.Ces problèmes peuvent être difficiles à détecter car ils se produisent au fil du temps et à manger lentement les ressources disponibles à partir de la portée de votre demande.Mais il existe des moyens de surveiller activement et d'empêcher que ces problèmes se produisent.Dans ce guide, nous vous avons montré pourquoi les fuites de mémoire peuvent se produire dans les applications Python et comment vous pouvez les empêcher.
Scout APM est l'un des meilleurs outils de surveillance pour rechercher les problèmes de mémoire Python et agir sur eux avant de endommager le fonctionnement normal de votre application.N'hésitez pas à vérifier les offres APM de Scout et à prendreUn essai gratuit de 14 joursPour le tester dans votre application en direct et voir son impact par vous-même.Assurez-vous également de vérifierBlog de ScoutPour plus de tels contenus sur la gestion de la mémoire Python et d'autres problèmes.Vous devriez envisager de vous abonner à la newsletter mensuelle de Scout pour la livraison de routine de ces guides à votre boîte aux lettres!
Questions fréquemment posées
Voici les réponses à certaines des questions les plus fréquemment posées sur les fuites de mémoire Python.
Qu'est-ce qu'une fuite de mémoire Python?
Une fuite de mémoire Python est une situation où l'espace mémoire disponible est réduit en raison d'une mauvaise gestion de la mémoire et d'un échec de libération de la mémoire à temps.Il peut s'avérer fatal pour les applications de toute échelle et type.
Comment Python gère-t-il les problèmes de mémoire?
Python gère la mémoire à l'aide d'une stratégie d'allocation / désallocation de mémoire dynamique où le tas de mémoire contient les objets utilisés dans le programme.Le Python Memory Manager s'occupe de l'allocation et de la désallocation de l'espace de tas via ses fonctions API.
Comment Python gère-t-il les fuites de mémoire?
Dans la plupart des cas, la langue Cpython sous-jacente garantit que le processus de collecte des ordures nettoie les données inutilisées et non référencées de la mémoire.Cependant, cela pourrait échouer un jour où vous devez intervenir et concevoir votre code pour gérer les fuites de mémoire en soi.
Comment trouver une fuite de mémoire sur une application?
La meilleure façon de trouver une fuite de mémoire dans une application est de surveiller son utilisation de la mémoire pour définir des intervalles de temps.Si vous remarquez une courbe de consommation de mémoire qui continue de monter tout au long de la disponibilité de votre application, cela pourrait être une indication d'une mauvaise structure de gestion de la mémoire.
Qu'est-ce qu'une fuite de mémoire dans une application?
Une fuite de mémoire est une situation dans laquelle une application ne libére pas autant de mémoire qu'elle occupe, et la mémoire utilisable disponible continue de réduire.Si elle n'est pas vérifiée dans le temps, une fuite de mémoire peut faire manger une application via toute la mémoire disponible et s'écraser lorsqu'il ne reste plus de mémoire.
Comment Python détecte-t-il les fuites de mémoire?
Vous pouvez détecter les fuites de mémoire dans Python en surveillant les performances de votre application Python via un outil de surveillance des performances d'application tel que Scout APM.Une fois que vous avez détecté une fuite de mémoire, il y aPlusieurs façons de le résoudre.
Comment empêchez-vous une fuite de mémoire en python?
Empêcher les fuites de mémoire dans Python n'est pas aussi difficile qu'il n'y paraît.Vous pouvez configurer une surveillance 24h / 24 et 7j / 7 pour vous informer des anomalies dans la consommation de mémoire de votre application, puis déboguer votre application pour savoir où il saigne de la mémoire.Vous pouvez également tirer parti des outils intégrés de Python tels que Tracemalloc pour aider à identifier facilement la cause d'une fuite de mémoire.