ddprof est disponible en version bêta. Datadog vous conseille de tester le profileur dans un environnement auxiliaire avant de le déployer en production.

Profils manquants sur la page de recherche de profils

Si vous avez configuré le profileur, mais qu’aucun profil ne s’affiche dans la page de recherche dédiée, activez la journalisation détaillée (-l debug) et ouvrez un ticket auprès de l’assistance. Ajoutez à ce ticket vos fichiers de log, ainsi que les informations suivantes :

  • Version du kernel Linux (uname -r)
  • Version de libc (ldd --version)
  • Valeur de /proc/sys/kernel/perf_event_paranoid
  • Ligne de commande complète, y compris les arguments du profileur et de l’application

La section ci-dessous répertorie les différents problèmes de configuration que vous pouvez rencontrer.

<ERROR> Error calling perfopen on watcher

Cette erreur survient généralement lorsque vous ne disposez pas des autorisations adéquates pour interagir avec le profileur. Cela est habituellement causé par la désactivation de fonctionnalités du système d’exploitation requises, qui entraîne l’échec du profiling. Ces paramètres doivent généralement être configurés au niveau des hosts, et non au niveau d’un pod ou d’un conteneur spécifique.

Afin de conserver la configuration après des redémarrages, définissez perf_event_paranoid en l’adaptant à votre distribution. Pour diagnostiquer le problème, exécutez la commande suivante :

echo 1 | sudo tee /proc/sys/kernel/perf_event_paranoid

Remarque : cette commande doit être exécutée à partir de l’espace de nommage d’un montage dans lequel l’objet /proc/sys/kernel/perf_event_paranoid existe et peut être écrit. Pour un conteneur, ce paramètre est hérité à partir du host.

Vous pouvez utiliser deux fonctionnalités pour remplacer la valeur de perf_event_paranoid :

  • CAP_SYS_ADMIN : ajoute de nombreuses autorisations, ce qui peut être déconseillé.
  • CAP_PERFMON : ajoute les fonctionnalités BPF et perf_event_open (disponible sous Linux 5.8 et ultérieur).

L’erreur peut également être causée par des problèmes d’autorisations plus rares :

  • Le profileur repose sur l’appel système perf_event_open(), qui est interdit par certains runtimes de conteneur. Consultez la documentation pertinente pour vérifier si c’est le cas pour votre runtime.
  • Certains profils seccomp interdisent l’utilisation de perf_event_open(). Si votre système exécute une configuration de ce type, vous ne pourrez pas exécuter le profileur.

“<ERROR> Could not mmap memory for watcher

Pour que le profileur puisse fonctionner correctement, il a besoin de mémoire « réservée ». Ce type de mémoire est limité par les paramètres du kernel. Pour consulter votre réglage actuel, utilisez la commande ulimit -l. La fonctionnalité suivante permet d’ignorer cette limite :

  • CAP_IPC_LOCK : permet d’utiliser la mémoire verrouillée (mémoire non paginée).

<WARNING> Could not finalize watcher

Cet avertissement peut être émis lorsque le système ne parvient pas à allouer suffisamment de mémoire verrouillée pour le profileur. Cela se produit généralement lorsqu’un trop grand nombre d’instances du profileur sont actives sur un host donné. Cette situation est comparable à l’instrumentation sur un même host d’un trop grand nombre de services conteneurisés. Pour résoudre ce problème, augmentez la limite de mémoire mlock() ou réduisez le nombre d’applications instrumentées.

Le calcul de cette limite peut tenir compte d’autres outils de profiling.

<WARNING> Failure to establish connection

Cette erreur signifie généralement que le profileur ne parvient pas à se connecter à l’Agent Datadog. Activez la journalisation relative à la configuration (--show_config) pour identifier le hostname et le numéro de port utilisés par le profileur pour les importations. Il est possible que le contenu du message d’erreur contienne le hostname et le numéro de port. Comparez ces valeurs à celle de la configuration de votre Agent. Consultez la section d’aide du profileur (ddprof --help) pour découvrir comment configurer l’URL de l’Agent.

Profils vides ou creux

La racine de votre profil correspond au frame dont le nom comporte le binaire de l’application. Si ce frame possède un temps CPU non négligeable, mais sans le moindre frame enfant, considérez les approches suivantes :

  • Les binaires « stripped » ne possèdent pas de symboles. Essayez d’utiliser un binaire qui n’est pas « stripped » ou une image de conteneur non minifiée.
  • Il est recommandé d’installer les packages de debugging de certaines applications et bibliothèques. C’est notamment le cas pour les services installés par l’intermédiaire du gestionnaire de package de votre référentiel ou d’un outil similaire.

Si la valeur Anonymous est affichée à la place du nom de votre fonction, vous utilisez potentiellement un langage interprété ou JIT. Dans ce cas, activez les informations sur les vidages JIT ou les cartes de performances.

Il est possible que vos profils soient vides (« No CPU time reported ») ou qu’ils ne contiennent que quelques frames. Vérifiez que votre application est suffisamment sollicitée. Le profileur s’active uniquement lorsque l’application instrumentée est planifiée sur le CPU.

Erreur lors du chargement des bibliothèques partagées

Lorsque vous utilisez le profileur en continu pour les langages compilés en tant que bibliothèque dynamique, il est possible que le lancement de votre application échoue et que vous receviez l’erreur suivante :

error while loading shared libraries: libdd_profiling.so: cannot open shared object file: No such file or directory

Ce problème survient lorsque votre application inclut la dépendance libdd_profiling.so, mais que celle-ci est introuvable lors du rapprochement des dépendances pendant l’exécution. Pour y remédier, suivez l’une des deux méthodes ci-dessous :

  • Recréez votre application avec une bibliothèque statique. Dans certains systèmes de build, il n’est pas toujours évident de choisir entre une bibliothèque dynamique et statique. Pour cette raison, utilisez la commande ldd pour vérifier si le binaire généré inclut une dépendance dynamique non souhaitée sur libdd_profiling.so.
  • Copiez libdd_profiling.so au sein d’un des répertoires dans le chemin de recherche de l’éditeur de liens dynamique. Pour obtenir la liste des répertoires disponibles, exécutez ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\n (commande valide sur la plupart des systèmes Linux).

Pour aller plus loin

Documentation, liens et articles supplémentaires utiles: