2022-11-21 12:21 Temps de lecture : 28 min

13 Logiciel de profilage pour déboguer les problèmes de performances des applications

L'objectif premier de toute application est de satisfaire pleinement ses utilisateurs finaux.

Pour cela, elle doit se montrer rapide, réactive, simple d'utilisation et fiable, parmi d'autres qualités souhaitables.

Cependant, assurer une maintenance logicielle permettant de maintenir des performances optimales n'est pas une tâche aisée.

Lorsque votre code commence à exécuter des fonctions superflues, à s'auto-saboter, à générer des erreurs et à s'empêtrer dans des boucles infinies, cela peut entraîner des inefficacités. Votre application peut alors devenir lente, ne plus répondre ou se comporter de manière anormale.

Si ces problèmes ne sont pas corrigés, cela nuira inévitablement aux performances globales de l'application.

Vos clients pourraient alors s'irriter ou cesser complètement d'utiliser votre application en raison de ses mauvaises performances et de sa lenteur. Non seulement votre réputation s'en trouvera ternie, mais cela se traduira également par une perte de revenus et de bénéfices. Il est donc crucial d'analyser, de réviser et de déboguer votre code afin d'obtenir des performances optimales. La méthode la plus rapide pour y parvenir est d'utiliser un outil de profilage logiciel qui permettra de surveiller et de déboguer vos codes, ainsi que d'éliminer les goulots d'étranglement liés aux performances.

Cet article vous initiera au concept du profilage logiciel et à ses avantages. Ensuite, je vous présenterai quelques-uns des meilleurs outils de profilage pour déboguer votre application et optimiser ses performances.

Qu'est-ce que le profilage logiciel ?

Le profilage logiciel désigne une analyse dynamique du code. Elle consiste à étudier le comportement d'un programme en utilisant les données collectées pendant son exécution. Son objectif est d'identifier les portions du programme qui nécessitent une optimisation pour améliorer la vitesse et la réactivité de l'application, tout en réduisant sa consommation de mémoire et de ressources.

Un profileur logiciel mesure généralement la durée et la fréquence des appels de fonctions, ainsi que la mémoire ou la complexité temporelle associée à un programme. Il existe aussi des profileurs spécialisés, comme les profileurs de mémoire.

Le profilage s'effectue habituellement en instrumentant le code source du programme. Les profileurs peuvent recourir à différentes techniques de profilage, notamment les méthodes instrumentées, basées sur des événements, statistiques ou encore de simulation.

Pourquoi le profilage logiciel est-il essentiel ?

Le profilage logiciel est indispensable pour évaluer l'utilisation des ressources et le temps d'exécution associé à une fonction spécifique. Il permet d'optimiser la vitesse du programme tout en garantissant une consommation minimale de ressources.

De plus, il permet de surveiller et d'optimiser l'utilisation du processeur et le temps d'exécution des commandes.

Il est donc primordial de sélectionner l'outil de profilage logiciel approprié afin de pouvoir déboguer plus rapidement les problèmes de performances, d'améliorer l'efficacité de l'application et d'offrir une expérience utilisateur optimale. De nombreux profileurs fournissent également des rapports détaillés, des graphiques et des visualisations interactives qui facilitent l'identification précise de la cause des problèmes, et par conséquent, leur résolution.

Voici une sélection des meilleurs profileurs logiciels que vous pouvez tester, n'hésitez pas à partager vos retours.

py-spy

py-spy est un excellent profileur d'échantillonnage pour Python. Il vous permet de visualiser précisément comment votre application Python utilise son temps.

Vous n'avez pas besoin de modifier votre code ni de redémarrer complètement le programme. py-spy induit une faible surcharge et est développé en Rust pour offrir une vitesse d'exécution accrue. Il n'est pas conçu pour fonctionner dans le même processus que votre programme Python profilé. Cela signifie que py-spy est très sûr et sécurisé pour une utilisation dans les environnements de production basés sur Python.

Cet outil permet d'enregistrer des profils et de générer des graphiques de flammes pour créer des fichiers SVG interactifs. Vous avez également la possibilité de modifier le taux d'échantillonnage, d'utiliser des extensions C natives pour le profilage, de profiler les sous-processus, les ID de thread, etc. La commande "top" offre une vue en direct des fonctions exécutées dans vos programmes, tandis que la commande "dump" affiche la pile d'appels actuelle pour chaque thread Python.

Il prend en charge toutes les versions de l'interpréteur CPython, de 2.3 à 2.7 et de 3.3 à 3.8. Vous pouvez installer py-spy depuis PyPI ou GitHub.

pyroscope

Le logiciel open source de profilage continu pyroscope vous aide à déboguer rapidement tout problème de performance de votre application.

Après avoir lancé le serveur, vous pouvez démarrer l'agent, que vous utilisiez Docker, Linux, ou que vous recherchiez de la documentation pour Ruby ou Go, Pyroscope a tout prévu. Même si vous avez besoin de données de profilage logiciel sur dix secondes ou dix mois, son moteur de stockage sur mesure assure des requêtes rapides.

Vous n'avez pas à vous soucier des surcoûts ou des performances de l'application car il utilise une technologie de profilage par échantillonnage qui n'affecte pas les performances. Pyroscope stocke vos données de profilage de manière efficace, ce qui le rend rentable, même si vous souhaitez conserver des données de profilage provenant de différentes applications pendant des années.

Il fonctionne sur macOS, Linux et Docker et prend en charge les programmes écrits en Python, Go et Ruby.

Bubbleprof

Bubbleprof de Clinic.js offre une approche innovante et unique pour le profilage des logiciels écrits en Node.js. Il utilise une interface utilisateur "bulle" qui aide aussi bien les experts que les débutants à identifier le temps asynchrone passé dans votre application.

Il visualise le fonctionnement de vos processus Node.js en observant leurs opérations asynchrones, en les regroupant, en calculant les délais et en les cartographiant.

Bubbleprof détermine les délais d'opération en analysant la taille des bulles dans un groupe spécifique d'opérations, qui peut être votre code, un noyau de nœud ou un module. Il rassemble également les groupes adjacents afin de réduire l'encombrement.

Pour calculer les délais lorsque l'opération passe d'un groupe à un autre, Bubbleprof mesure la longueur de la flèche qui relie les bulles. En complément, il utilise différentes couleurs pour visualiser les processus de mesure. Les lignes colorées internes représentent un mélange de types d'opérations asynchrones comme cause de retard.

Pinstrument

Optimisez vos codes Python avec Pinstrument.

Il vous indique les raisons de la lenteur de votre code Python et vous aide à diagnostiquer les problèmes pour obtenir des performances extrêmement rapides.

Pour utiliser Pyinstrument, il n'est pas nécessaire d'écrire de script Python spécifique ; il suffit d'invoquer Pyinstrument directement à partir de la ligne de commande. Votre script s'exécute normalement et l'outil génère un résumé coloré des zones où l'application a passé son temps. Une API Python est également disponible pour simplifier le processus.

Vous avez également la possibilité de profiler les requêtes web dans Flask et Django, pour lesquelles une documentation détaillée est fournie. Il est important de noter que Pyinstrument utilise un profilage statistique qui enregistre la pile d'appels toutes les millisecondes, au lieu de suivre chaque appel de fonction effectué par votre programme.

Le principal avantage des profileurs statistiques est qu'ils induisent moins de frais généraux que les profileurs de suivi. Comme il enregistre l'intégralité de la pile, le suivi des appels de fonctions coûteux devient plus facile. De plus, Pyinstrument masque (par défaut) les cadres de bibliothèque, ce qui vous permet de vous concentrer sur les applications ou modules responsables des problèmes de performance.

Le débogage des problèmes de performance est simplifié par le fait que Pyinstrument enregistre le temps passé en utilisant l'horloge murale. L'outil suit le temps total d'exécution du programme pour lire les fichiers, télécharger les données, communiquer avec une base de données, etc.

Xdebug

Pour améliorer les performances de votre code et rendre votre expérience de développement plus agréable, Xdebug offre des fonctionnalités complètes pour le profilage et le débogage.

Il s'agit en fait d'une extension PHP qui vous permet de repérer les goulots d'étranglement de votre application PHP et d'analyser ses performances à l'aide d'outils de visualisation externes pour générer des graphiques de performance.

Xdebug crée une sortie détaillée indiquant le chemin parcouru par l'application pour arriver à une erreur, y compris les paramètres qu'elle a transmis à une fonction donnée. Cette fonctionnalité permet de suivre les erreurs. Pour aider le développeur à mieux comprendre, il génère des informations codées en couleur et des vues structurées.

Il est également livré avec un débogueur distant que vous pouvez utiliser pour connecter Xdebug avec un code en cours d'exécution, un IDE ou un navigateur pour observer les points d'arrêt du code et exécuter les codes ligne par ligne. Il offre une autre fonctionnalité : la couverture de code, qui indique la proportion du code de votre programme qui a été exécutée. Cela peut aussi être utile pour les tests unitaires.

SPX

L'extension de profilage simple (SPX) est une extension de profilage conçue pour PHP. Elle possède des caractéristiques uniques qui la distinguent des autres extensions de profilage. Son utilisation est entièrement GRATUITE et limitée à votre infrastructure, ce qui signifie qu'il n'y a aucun risque de fuite de données.

La simplicité de SPX le rend très facile à utiliser : il suffit de définir une ligne de commande ou une variable d'environnement pour profiler un script. Vous pouvez également activer le bouton radio sur une page web pour profiler le script. Ainsi, il n'est pas nécessaire d'instrumenter votre code manuellement.

Il prend également en charge l'arrêt d'un script de ligne de commande en cours d'exécution via Ctrl-C. De plus, il n'est pas nécessaire d'utiliser un lanceur de ligne de commande ou une extension de navigateur spécifique. SPX prend en charge environ 22 métriques différentes, y compris des métriques de temps et de mémoire, les objets et fichiers utilisés, les E/S, etc.

Il peut collecter des données sans quitter le contexte. Son interface utilisateur web permet de configurer/activer le profilage pour la session de navigation en cours, et répertorie tous les détails et les rapports des scripts profilés. L'interface web vous permet de sélectionner un rapport spécifique pour une analyse plus approfondie et propose des visualisations interactives telles que Flamegraph, un profil plat et une chronologie qui peuvent s'adapter à des millions d'appels de fonction.

Prefix

Prefix de Stackify est un profileur de code léger et facile à installer qui est très apprécié par de nombreux développeurs. Il vous aide à éliminer les goulots d'étranglement qui nuisent aux performances de votre application, afin d'améliorer l'expérience utilisateur.

Les excellentes capacités de traçage et de profilage de Prefix vous permettent de détecter rapidement les exceptions cachées, les requêtes SQL lentes, etc. Il offre à vos développeurs la véritable puissance de l'APM (Application Performance Monitoring). Pour cela, Prefix évalue les performances du code tel qu'il est écrit et vous permet de tester les codes les plus performants.

Ainsi, il réduit le nombre de tickets de support remontant de la production et aide les responsables du développement à atteindre leurs objectifs plus rapidement. Identifiez toutes les requêtes sous-performantes, les goulots d'étranglement inconnus et les requêtes générées par ORM.

Vous pouvez également suivre chaque paramètre d'appel SQL, télécharger les temps d'exécution et afficher les enregistrements concernés. Prefix simplifie aussi la détection des modèles N+1. Plus besoin de trier des journaux confus, ils sont regroupés pour faciliter la localisation des problèmes.

Prefix vous permet d'accéder directement au contexte d'un journal suspect dans une demande de requête, et de passer d'un journal à une trace pour faciliter le débogage. Prefix met en évidence les dépendances peu performantes, ce qui est pratique pour identifier les exceptions cachées et travailler avec du code hérité ou des sections de framework. Ces dépendances peuvent être des services web, des services tiers, des services de cache, etc.

Prefix fonctionne sur Windows et Mac et prend en charge .Net, Ruby, Java, PHP, Python et Node.js.

Scalene

Scalene est un profileur GPU, CPU et mémoire de haute précision et haute performance pour les programmes basés sur Python. Il offre plusieurs avantages par rapport aux autres profileurs, comme une exécution plus rapide et des informations plus détaillées.

Scalene est incroyablement rapide et utilise l'échantillonnage plutôt que l'instrumentation. Il ne s'appuie même pas sur les fonctionnalités de traçage de Python. De plus, ses frais généraux sont généralement inférieurs à 10-20%. Cet outil effectue le profilage du logiciel au niveau de la ligne et pointe vers les lignes de code qui sont responsables du temps d'exécution de votre programme.

Ces détails sont plus précieux que ceux d'un profilage au niveau de la fonction. Scalene sépare le temps passé uniquement en Python de celui passé dans le code natif, qui comprend des bibliothèques. Comme la plupart des programmeurs Python n'optimiseront pas les performances du code natif, les développeurs peuvent concentrer leurs efforts sur l'optimisation des codes qu'ils peuvent réellement améliorer.

Il met en évidence les points chauds en rouge afin d'identifier plus facilement le temps CPU/l'allocation de mémoire et de séparer facilement le temps système pour identifier les problèmes d'E/S. Scalene peut fournir le temps GPU, profiler l'utilisation de la mémoire et suivre l'utilisation du processeur. Il peut également identifier les fuites de mémoire potentielles, le volume de copie de profil et générer des profils réduits pour les lignes de code consommant plus de 1 % du processeur.

VisualVM

L'outil de dépannage tout-en-un pour Java, VisualVM, est conçu pour être utilisé aussi bien pendant les phases de production que de développement. Il s'agit d'un outil visuel qui intègre des fonctionnalités de profilage légères et des outils JDK en ligne de commande.

VisualVM surveille les applications qui fonctionnent sur Java 1.4+ et les dépanne en utilisant plusieurs technologies comme JMX, jvmstat, Attach API et Serviceability Agent. Cet outil est parfaitement adapté aux différents besoins des ingénieurs qualité, des administrateurs système et des utilisateurs finaux.

Il détecte automatiquement les applications Java exécutées à distance et localement et les répertorie. L'outil permet également de définir les programmes manuellement à l'aide de la connexion JMX. Pour chaque processus, il affiche des données d'exécution standard comme le PID, les arguments passés, le répertoire JDK, la classe principale, les options JVM, la version JVM et les propriétés système et d'argument.

VisualVM surveille l'utilisation du processeur, le tas et le méta-espace ou la mémoire de génération permanente, les threads en cours d'exécution et les classes chargées dans une application. Il affiche tous les threads en cours d'exécution dans une chronologie avec les temps de sommeil, d'exécution, de blocage, de surveillance et d'attente agrégés.

Les profileurs d'instrumentation et d'échantillonnage peuvent être exécutés à l'aide de VisualVM pour la gestion de la mémoire et les performances de l'application. Il affiche les vidages de threads pour fournir un aperçu rapide des processus. Il visualise et crée également des instantanés .hprof à la demande pour vous aider à identifier les inefficacités d'utilisation du tas et à déboguer les fuites de mémoire.

De plus, VisualVM peut lire des données de base sur un processus Java en panne et son environnement. Vous pouvez analyser vos applications hors ligne ; il est possible d'enregistrer l'environnement d'exécution et la configuration de l'application avec des vidages de tas, des vidages de threads et des instantanés de profilage, afin de les analyser plus tard.

Il fonctionne sous Windows, Linux et Unix.

Orbit Profiler

Visualisez votre application C/C++ et identifiez rapidement les problèmes de performances en utilisant Orbit Profiler. Il s'agit d'un outil de débogage et d'un profileur autonome qui vise à aider les développeurs à visualiser et à comprendre le déroulement de l'exécution d'une application complexe.

Il offre une vue précise de tout ce qui se passe dans l'application, afin que vous puissiez éliminer rapidement les goulots d'étranglement et rétablir des performances optimales.

Orbit Profiler peut fonctionner efficacement sur n'importe quelle application C ou C++, tant qu'il peut accéder au fichier PDB. Il lancera le profilage dès que vous aurez terminé de télécharger votre programme. L'outil se connecte au processus cible, se relie aux fonctions sélectionnées et effectue le profilage.

Il peut même fonctionner sur vos versions finales ou d'expédition optimisées. Outre l'instrumentation dynamique, Orbit Profiler offre également des capacités d'échantillonnage "toujours actives", rapides, disponibles à tout moment et robustes.

Il fonctionne sous Windows et Linux.

Uber JVM Profiler

Doté de fonctionnalités de profilage avancées, Uber JVM Profiler est une autre option intéressante pour vos applications basées sur Java.

Il propose un agent Java qui collecte plusieurs traces de pile et des métriques pour les processus Spark/Hadoop JVM de manière distribuée, telles que les métriques de mémoire/CPU/IO.

L'outil peut tracer les arguments et les méthodes Java sur les codes utilisateur sans les modifier. Vous pouvez également l'utiliser pour suivre la latence des appels des nœuds de nom HDFS pour chaque application Spark et identifier les problèmes. Il est même possible de tracer les chemins de fichiers HDFS de l'application Spark pour identifier les fichiers chauds et effectuer des optimisations supplémentaires.

Uber JVM Profiler a été conçu à l'origine pour profiler les applications Spark qui impliquent souvent de nombreuses machines ou processus pour une seule application. Ainsi, les utilisateurs peuvent facilement corréler les métriques de ces machines ou processus.

Cependant, l'outil fonctionne comme un agent Java classique et peut être utilisé pour n'importe lequel de vos processus JVM. Ses fonctionnalités incluent :

  • Le débogage de l'utilisation de la mémoire des exécutants d'application Spark, comme la mémoire de tas Java, la mémoire native, la mémoire hors tas, le pool de mémoire tampon et le pool de mémoire.
  • Le débogage de l'utilisation du processeur et du temps de récupération de la mémoire.
  • Le débogage des méthodes de classe Java pour leur fréquence et leur durée, ou le profilage de durée.
  • Le profilage d'arguments (débogage et traçage de l'appel de méthode de classe Java et de sa valeur d'argument).
  • Le profilage Stacktrack et la génération de Flamegraphs pour le temps CPU.
  • Le débogage des métriques d'E/S et des métriques de thread JVM.

Tracy

Tracy est un outil pratique pour aider les développeurs à déboguer facilement les programmes PHP. Il est doté d'une conception conviviale et de fonctionnalités avancées, comme la prise en charge CLI et le débogage des appels AJAX.

Il peut identifier et corriger rapidement les erreurs, vider les variables, consigner les erreurs, visualiser la consommation de mémoire et déterminer le temps d'exécution des requêtes ou des scripts. L'utilisation d'un code couleur et la mise en évidence des problèmes en rouge avec des explications claires vous aident à visualiser facilement les exceptions et les erreurs, et à les comprendre.

Tracy inclut une fonctionnalité de journalisation et une détection automatique de l'environnement. Il stocke les données dans des fichiers journaux et affiche les messages d'erreur du serveur à un visiteur pendant les temps d'arrêt. Tracy peut également s'intégrer à Drupal 7, OpenCart, WordPress, etc.

vprof

vprof est un profileur visuel pour les applications Python. Il fournit des visualisations riches et interactives pour les différentes caractéristiques de votre programme Python, comme l'utilisation de la mémoire et le temps d'exécution.

Il est disponible sous licence BSD et prend en charge Python 3.4 et versions ultérieures.

Conclusion

Les performances d'une application sont essentielles pour répondre aux attentes des utilisateurs finaux. En cas de problèmes de performances, il est crucial d'être en mesure de diagnostiquer le problème avant qu'il n'affecte l'expérience utilisateur.

Par conséquent, continuez à optimiser vos applications et à résoudre les problèmes immédiatement pour continuer à fournir des performances optimales aux utilisateurs, en utilisant les outils présentés dans cet article.

Voici un tableau comparatif rapide qui résume les profileurs ci-dessus et leur utilisation principale.

Nom Langues
py-spy Python
pyroscope Python, Ruby, Go
Bubbleprof Node.js
Pinstrument Python
Xdebug PHP
SPX PHP
Prefix Python, .NET, Java, Node.js, Ruby, PHP
Scalene Python
VisualVM Java
Orbit Profiler C, C++
Uber JVM Profiler Java
Tracy PHP
vprof Python
Auteur
France

Rédacteur tech, guides pratiques et astuces numériques.