{"id":1459,"date":"2022-05-04T12:01:19","date_gmt":"2022-05-04T10:01:19","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1459"},"modified":"2022-05-04T12:01:19","modified_gmt":"2022-05-04T10:01:19","slug":"profiler-un-pod-dans-kubernetes-avec-kubectl-flame","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/profiler-un-pod-dans-kubernetes-avec-kubectl-flame\/","title":{"rendered":"Profiler un pod dans Kubernetes avec kubectl flame"},"content":{"rendered":"<p>Kubectl flame est un plugin pour kubectl qui vous permet de profiler des applications en production avec un faible co\u00fbt en g\u00e9n\u00e9rant des FlameGraphs.<\/p>\n<p>C&rsquo;est un projet Yahoo.<\/p>\n<p>Il s&rsquo;installe via <a href=\"https:\/\/krew.sigs.k8s.io\/\" rel=\"noopener\" target=\"_blank\">krew<\/a>, le gestionnaire de plugin pour kubectl, et permet de g\u00e9n\u00e9rer des FlameGraphs pour des applications en Go, Java (tous les langages JVM), Python, Ruby, et NodeJS.<\/p>\n<p>Apr\u00e8s avoir install\u00e9 krew, vous pouvez installer flame via : <code>kubectl krew install flame<\/code>.<\/p>\n<p>Pour chaque langage support\u00e9, il va utiliser un profiler diff\u00e9rents pour g\u00e9n\u00e9rer un FlameGraph. Ces profilers sont de type <strong>sampling<\/strong>, et en se basant sur ces informations de sampling (combien de fois une m\u00e9thode a \u00e9t\u00e9 appel\u00e9e), il va g\u00e9n\u00e9rer un FlameGraph.<\/p>\n<h2>FlameGraph<\/h2>\n<p>Un FlameGraph est un moyen de visualiser le profil d&rsquo;une application permettant de d\u00e9tecter instantan\u00e9ment (ou tr\u00e8s rapidement) le chemin de code le plus fr\u00e9quent.<\/p>\n<p>Il affichera, en abscisse, la population (g\u00e9n\u00e9ralement la m\u00e9thode) dont la taille est proportionnelle au nombre d&rsquo;\u00e9chantillons dans le profil,\net en ordonn\u00e9e, la profondeur dans la pile d&rsquo;appels.<\/p>\n<p>Plus d&rsquo;information sur le site de Brendan Gregg : <a href=\"https:\/\/www.brendangregg.com\/flamegraphs.html\" rel=\"noopener\" target=\"_blank\">FlameGraphs<\/a>.<\/p>\n<p>Voici un exemple de FlameGraph tir\u00e9 du site de Brendan Gregg.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cpu-mysql-updated.png?resize=640%2C401&#038;ssl=1\" alt=\"\" width=\"640\" height=\"401\" class=\"alignnone size-full wp-image-1465\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cpu-mysql-updated.png?w=1000&amp;ssl=1 1000w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cpu-mysql-updated.png?resize=300%2C188&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cpu-mysql-updated.png?resize=768%2C481&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cpu-mysql-updated.png?resize=431%2C270&amp;ssl=1 431w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<h2>kubetcl sans et avec le plugin flame<\/h2>\n<p>Pour g\u00e9n\u00e9rer un FlameGraph d&rsquo;une application Java d\u00e9ploy\u00e9 dans un pod <strong>pod-my-app<\/strong> 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 \u00e7a :<\/p>\n<pre>\nwget https:\/\/github.com\/jvm-profiling-tools\/async-profiler\/releases\/download\/v2.7\/async-profiler-2.7-linux-x64.tar.gz\nkubectl cp async-profiler-2.7-linux-x64.tar.gz pod-my-app:\/tmp\nkubectl exec -ti pod-my-app -- bash\n$ tar xvf \/tmp\/async-profiler-2.7-linux-x64.tar.gz\n$ \/tmp\/async-profiler-2.7-linux-x64\/profiler.sh -d 60 -e cpu -f \/tmp\/profile-cpu.html 1\n$ exit\nkubectl cp pod-my-app:\/tmp\/profile-cpu.html .\/profile-cpu.html\n<\/pre>\n<p>Beaucoup d&rsquo;\u00e9tapes, certaines n\u00e9cessitants des droits \u00e9lev\u00e9s sur le cluster Kubernetes.<\/p>\n<p>Avec le plugin flame de kubectl, une seule commande suffit !<\/p>\n<pre>\nkubectl flame -t  30s --lang java -e cpu -f profile-cpu.svg pod-my-app\n<\/pre>\n<p>On peut noter ici une petite diff\u00e9rence : le profiler Java utilis\u00e9 par kubectl flame est async-profiler en version 1 qui g\u00e9n\u00e8re des FlameGraphs au format SVG, alors que la version 2 les g\u00e9n\u00e8re au format HTML. Kubectl flame \u00e9tant un projet open source, j&rsquo;ai ouvert une PR pour passer \u00e0 async-profiler 2 mais je n&rsquo;ai pas encore eu le temps de la terminer.<\/p>\n<h2>kubetcl flame en d\u00e9tail<\/h2>\n<p>Prenons la commande suivante :<\/p>\n<pre>\nkubectl flame -t  30s --lang java -e cpu -f profile-cpu.svg pod-my-app\n<\/pre>\n<ul><li><strong>-t 30s<\/strong> : va profiler l&rsquo;application pendant 30s.<\/li>\n\n<li><strong>&#8211;lang java<\/strong> : pour les applications Java \/ JVM.<\/li>\n\n<li><strong>-e cpu<\/strong> : profile l&rsquo;\u00e9v\u00e8nement CPU, tous les \u00e9v\u00e8nements support\u00e9s par async-profiler sont support\u00e9s.<\/li>\n\n<li><strong>-f profile-cpu.svg<\/strong> : va sauvegarder le profile dans le fichier local profile-cpu.svg.<\/li>\n<\/ul>\n<p>Le plus int\u00e9ressant avec kubectl flame, c&rsquo;est qu&rsquo;on va utiliser la m\u00eame ligne de commande avec les m\u00eames options pour les diff\u00e9rents langages qu&rsquo;il supporte.<\/p>\n<p>Exemple, pour une application en Go d\u00e9marr\u00e9 dans le pod <strong>hello-go<\/strong> :<\/p>\n<pre>\nkubectl flame -t 30s --lang go -f profile-cpu.svg hello-go\n<\/pre>\n<p>Quand aucun \u00e9v\u00e8nement n&rsquo;est pass\u00e9 \u00e0 la ligne de commande, c&rsquo;est l&rsquo;\u00e9v\u00e8nement par d\u00e9faut (g\u00e9n\u00e9ralement le CPU) qui va \u00eatre profiler.<\/p>\n<p>Le fonctionnement de kubectl flame est le suivant :<\/p>\n<ul><li>Un Job Kubernetes est lanc\u00e9, cela permet de s&rsquo;assurer du bon d\u00e9roulement du profiling et de le relancer si n\u00e9cessaire.<\/li>\n\n<li>Le Job va lancer un Pod.<\/li>\n\n<li>Le Pod va utiliser une image de profiler correspondant au langage, puis localiser le process de l&rsquo;application \u00e0 profiler (l&rsquo;option <code>--pgrep<\/code> permet de sp\u00e9cifier le nom de la commande a rechercher).<\/li>\n\n<li>Le fichier de profil r\u00e9sultant sera copier en local.<\/li>\n<\/ul>\n<p>Pour plus d&rsquo;information sur kubectl flame vous pouvez aller voir sur son repo GitHub : <a href=\"https:\/\/github.com\/yahoo\/kubectl-flame\" rel=\"noopener\" target=\"_blank\"><a href=\"https:\/\/github.com\/yahoo\/kubectl-flame\">https:\/\/github.com\/yahoo\/kubectl-flame<\/a><\/a>.\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Kubectl flame est un plugin pour kubectl qui vous permet de profiler des applications en production avec un faible co\u00fbt en g\u00e9n\u00e9rant des FlameGraphs. C&rsquo;est un projet Yahoo. Il s&rsquo;installe via krew, le gestionnaire de plugin pour kubectl, et permet de g\u00e9n\u00e9rer des FlameGraphs pour des applications en Go, Java (tous les langages JVM), Python, Ruby, et NodeJS. Apr\u00e8s avoir install\u00e9 krew, vous pouvez installer flame via : kubectl krew install flame. Pour chaque langage support\u00e9, il va utiliser un&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/profiler-un-pod-dans-kubernetes-avec-kubectl-flame\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[],"class_list":["post-1459","post","type-post","status-publish","format-standard","hentry","category-informatique"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1258,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/profiler-une-application-java-dans-un-conteneur-deploye-dans-kubernetes-avec-jfr-java-flight-recorder\/","url_meta":{"origin":1459,"position":0},"title":"Profiler une application Java dans un conteneur d\u00e9ploy\u00e9 dans kubernetes avec JFR &#8211; Java Flight Recorder","author":"admin","date":"lundi 12 avril 2021","format":false,"excerpt":"La plupart des clients chez lesquels j'interviens aujourd'hui utilisent Kubernetes pour d\u00e9ployer leurs applications. Bien que Kubernetes soit un super outil, si on a besoin de ce type d'outil (qui est une discussion dans laquelle je ne rentrerais pas ici), il peut apporter une certaine complexit\u00e9 quant aux moyens de\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":19,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/ruby-on-rails\/","url_meta":{"origin":1459,"position":1},"title":"Ruby on Rails","author":"admin","date":"jeudi 15 f\u00e9vrier 2007","format":false,"excerpt":"Bonjour, d'habitude au ton bucolique des vacances ou revendicatif des coups de gueules, aujourd'hui le ton de ce post va \u00eatre technophile. En effet, je bosse dans l'informatique qui est donc un de mes centre d'int\u00e9r\u00eat, et je vous livre ici mon premier message sur les nouvelles technologies. J'ai tester\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1153,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/profiler-une-image-native-graalvm-avec-perf\/","url_meta":{"origin":1459,"position":2},"title":"Profiler une image native GraalVM avec perf","author":"admin","date":"lundi 16 novembre 2020","format":false,"excerpt":"L'outil GraalVM native-image permet de g\u00e9n\u00e9rer un ex\u00e9cutable natif (ou image native) depuis votre application Java. Cet ex\u00e9cutable natif va d\u00e9marrer tr\u00e8s rapidement et avoir une empreinte m\u00e9moire beaucoup plus faible qu'une application Java traditionnelle; au prix de performances en pic r\u00e9duites et d'un temps de cr\u00e9ation de ce package\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/flamegraph-2.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/flamegraph-2.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/flamegraph-2.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/flamegraph-2.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1041,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/introduction-a-jmh-java-microbenchmark-harness\/","url_meta":{"origin":1459,"position":3},"title":"Introduction \u00e0 JMH &#8211; Java Microbenchmark Harness","author":"admin","date":"mercredi 29 avril 2020","format":false,"excerpt":"Dans mon pr\u00e9c\u00e9dent article For vs Stream, j'ai utilis\u00e9 JMH \u2013 The Java Microbenchmark Harness, un outil pour r\u00e9aliser des microbenchmarks de mani\u00e8re facile, et surtout, pertinente. Cet article \u00e0 pour but de vous pr\u00e9senter l'outil et son utilisation. Mais tout d'abord : c'est quoi un microbenchmark ? Microbenchmark Benchmark\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":68,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/friendly-url\/","url_meta":{"origin":1459,"position":4},"title":"Friendly URL","author":"admin","date":"lundi 11 f\u00e9vrier 2008","format":false,"excerpt":"Dans cet article, je vais vous parler des Friendly URL et vous donner un exemple d'impl\u00e9mentation en Java\/J2EE. D'autres technologie permettent facilement de mettre en place ce type de fonctionnalit\u00e9. On peut parler de user-friendly ou de search-engine-friendly URL. Pour ma part, une bonne Friendly URL est pour les deux!\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":827,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/devfest-lille-2018\/","url_meta":{"origin":1459,"position":5},"title":"Devfest Lille 2018","author":"admin","date":"vendredi  6 juillet 2018","format":false,"excerpt":"Il y a quelques semaines, j'ai eu la chance d'assister au DevFest Lille, organis\u00e9 par le GDG Lille. Mon impression globale : une tr\u00e8s bonne organisation, des locaux sympa (merci l'IMT Lille-Douai), des talks int\u00e9r\u00e9ssant et beaucoup de bonne humeur! Voici un petit retour sur les talks auxquels j'ai assist\u00e9s\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1459"}],"version-history":[{"count":8,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1459\/revisions"}],"predecessor-version":[{"id":1468,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1459\/revisions\/1468"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}