Profiler un pod dans Kubernetes avec kubectl flame

Profiler un pod dans Kubernetes avec kubectl flame

Kubectl flame est un plugin pour kubectl qui vous permet de profiler des applications en production avec un faible coût en générant des FlameGraphs.

C’est un projet Yahoo.

Il s’installe via krew, le gestionnaire de plugin pour kubectl, et permet de générer des FlameGraphs pour des applications en Go, Java (tous les langages JVM), Python, Ruby, et NodeJS.

Après avoir installé krew, vous pouvez installer flame via : kubectl krew install flame.

Pour chaque langage supporté, il va utiliser un profiler différents pour générer un FlameGraph. Ces profilers sont de type sampling, et en se basant sur ces informations de sampling (combien de fois une méthode a été appelée), il va générer un FlameGraph.

FlameGraph

Un FlameGraph est un moyen de visualiser le profil d’une application permettant de détecter instantanément (ou très rapidement) le chemin de code le plus fréquent.

Il affichera, en abscisse, la population (généralement la méthode) dont la taille est proportionnelle au nombre d’échantillons dans le profil,
et en ordonnée, la profondeur dans la pile d’appels.

Plus d’information sur le site de Brendan Gregg : FlameGraphs.

Voici un exemple de FlameGraph tiré du site de Brendan Gregg.

kubetcl sans et avec le plugin flame

Pour générer un FlameGraph d’une application Java déployé dans un pod pod-my-app en utilisant async-profiler, et en partant du principe que le process Java a un pid de 1, nous devrions faire quelque chose proche de ça :

wget https://github.com/jvm-profiling-tools/async-profiler/releases/download/v2.7/async-profiler-2.7-linux-x64.tar.gz
kubectl cp async-profiler-2.7-linux-x64.tar.gz pod-my-app:/tmp
kubectl exec -ti pod-my-app -- bash
$ tar xvf /tmp/async-profiler-2.7-linux-x64.tar.gz
$ /tmp/async-profiler-2.7-linux-x64/profiler.sh -d 60 -e cpu -f /tmp/profile-cpu.html 1
$ exit
kubectl cp pod-my-app:/tmp/profile-cpu.html ./profile-cpu.html

Beaucoup d’étapes, certaines nécessitants des droits élevés sur le cluster Kubernetes.

Avec le plugin flame de kubectl, une seule commande suffit !

kubectl flame -t  30s --lang java -e cpu -f profile-cpu.svg pod-my-app

On peut noter ici une petite différence : le profiler Java utilisé par kubectl flame est async-profiler en version 1 qui génère des FlameGraphs au format SVG, alors que la version 2 les génère au format HTML. Kubectl flame étant un projet open source, j’ai ouvert une PR pour passer à async-profiler 2 mais je n’ai pas encore eu le temps de la terminer.

kubetcl flame en détail

Prenons la commande suivante :

kubectl flame -t  30s --lang java -e cpu -f profile-cpu.svg pod-my-app
  • -t 30s : va profiler l’application pendant 30s.
  • –lang java : pour les applications Java / JVM.
  • -e cpu : profile l’évènement CPU, tous les évènements supportés par async-profiler sont supportés.
  • -f profile-cpu.svg : va sauvegarder le profile dans le fichier local profile-cpu.svg.

Le plus intéressant avec kubectl flame, c’est qu’on va utiliser la même ligne de commande avec les mêmes options pour les différents langages qu’il supporte.

Exemple, pour une application en Go démarré dans le pod hello-go :

kubectl flame -t 30s --lang go -f profile-cpu.svg hello-go

Quand aucun évènement n’est passé à la ligne de commande, c’est l’évènement par défaut (généralement le CPU) qui va être profiler.

Le fonctionnement de kubectl flame est le suivant :

  • Un Job Kubernetes est lancé, cela permet de s’assurer du bon déroulement du profiling et de le relancer si nécessaire.
  • Le Job va lancer un Pod.
  • Le Pod va utiliser une image de profiler correspondant au langage, puis localiser le process de l’application à profiler (l’option --pgrep permet de spécifier le nom de la commande a rechercher).
  • Le fichier de profil résultant sera copier en local.

Pour plus d’information sur kubectl flame vous pouvez aller voir sur son repo GitHub : https://github.com/yahoo/kubectl-flame.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.