{"id":1650,"date":"2023-04-04T16:48:44","date_gmt":"2023-04-04T14:48:44","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1650"},"modified":"2023-04-04T16:48:44","modified_gmt":"2023-04-04T14:48:44","slug":"le-profiler-sql-de-visualvm","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/le-profiler-sql-de-visualvm\/","title":{"rendered":"Le profiler SQL de VisualVM"},"content":{"rendered":"<p>Il y a peu, j&rsquo;ai d\u00e9couvert le profiler SQL de VisualVM et je me suis dit que je devais aussi vous le faire d\u00e9couvrir ;).<\/p>\n<p>VisualVM est un outil qui fournit une interface visuelle pour afficher des informations d\u00e9taill\u00e9es sur les applications qui s&rsquo;ex\u00e9cutent sur une machine virtuelle Java (JVM). VisualVM est con\u00e7u pour une utilisation au d\u00e9veloppement et en production.<\/p>\n<p>VisualVM fournit des outils de profiling l\u00e9ger dont un profiler SQL. Celui-ci va d\u00e9tecter chaque requ\u00eate SQL (passant par la couche JDBC) et les regrouper dans une vue tabulaire avec le nombre d&rsquo;ex\u00e9cutions de la requ\u00eate et le temps total d&rsquo;ex\u00e9cution.<\/p>\n<p>Cette vue tabulaire permet en un coup d\u2019\u0153il de d\u00e9tecter les requ\u00eates qui impactent le plus la performance. En effet, une requ\u00eate appel\u00e9e souvent mais r\u00e9pondant rapidement n&rsquo;est g\u00e9n\u00e9ralement pas probl\u00e9matique, de m\u00eame une requ\u00eate ayant un important temps d\u2019ex\u00e9cution, mais s&rsquo;effectuant rarement n&rsquo;est g\u00e9n\u00e9ralement pas probl\u00e9matique pour la performance globale d&rsquo;une application (mais peut l&rsquo;\u00eatre pour la partie de l&rsquo;application qui la g\u00e9n\u00e8re). Quand on veut optimiser les performances d&rsquo;une application, on va donc g\u00e9n\u00e9ralement s&rsquo;int\u00e9resser aux requ\u00eates dont le temps d&rsquo;execution totale (l&rsquo;addition des temps de chaque ex\u00e9cution de la requ\u00eate) est la plus importante. G\u00e9n\u00e9ralement, on va regarder le top 3, 5 ou 10 des requ\u00eates ayant le plus haut temps d&rsquo;ex\u00e9cution totale et chercher \u00e0 les optimiser.<\/p>\n<p>Voici un exemple d&rsquo;optimisation faite suite \u00e0 analyse des performances de Kestra en utilisant le profiler SQL de VisualVM. <a href=\"https:\/\/www.kestra.io\" rel=\"noopener\" target=\"_blank\">Kestra<\/a> est une plate-forme d&rsquo;orchestration et de scheduling de donn\u00e9e hautement scalabe, qui cr\u00e9e, ex\u00e9cute, planifie, et surveille des millions de pipelines complexes. C&rsquo;est aussi la soci\u00e9t\u00e9 dans laquelle je travaille depuis 3 mois !<\/p>\n<p>Kestra, en version open source, utilise un moteur base de donn\u00e9es, l&rsquo;Edition d&rsquo;Entreprise permet d&rsquo;utiliser un moteur alternatif bas\u00e9e sur Kafka et Elasticsearch. Le moteur base de donn\u00e9es supporte H2, PostgreSQL, et MySQL. L&rsquo;optimisation en question a \u00e9t\u00e9 r\u00e9alis\u00e9 pour PostgreSQL.<\/p>\n<p>Le profiler JDBC de VisualVM est accessible via l&rsquo;onglet <strong>Profiler<\/strong> en cliquant sur le bouton <strong>JDBC<\/strong>. On peut le configurer avec un texte pour filtrer les requ\u00eates \u00e0 analyser. Une fois lanc\u00e9, celui-ci va enregistrer chaque requ\u00eate ex\u00e9cut\u00e9e et afficher un tableau avec, pour chaque requ\u00eate, le temps total d&rsquo;ex\u00e9cution, le pourcentage par rapport \u00e0 l&rsquo;ensemble des requ\u00eates, ainsi que le nombre d&rsquo;ex\u00e9cutions.<\/p>\n<p>Pour mon cas d&rsquo;utilisation, le r\u00e9sultat \u00e9tait le suivant.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25.png?resize=640%2C390&#038;ssl=1\" alt=\"\" width=\"640\" height=\"390\" class=\"alignnone size-large wp-image-1656\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25.png?resize=1024%2C624&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25.png?resize=300%2C183&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25.png?resize=768%2C468&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25.png?resize=443%2C270&amp;ssl=1 443w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25.png?w=1340&amp;ssl=1 1340w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25.png?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Comme toujours en performance, il faut s\u2019int\u00e9resser aux <strong>n top<\/strong> probl\u00e8mes. Ici, je vais m&rsquo;int\u00e9r\u00e9sser aux 4 premi\u00e8res requ\u00eates, qui sont la variation de la m\u00eame requ\u00eate sur la table <code>queues<\/code>. On peut constater qu&rsquo;unitairement les requ\u00eates prennent environ 7ms; en fonction de la taille de la base de donn\u00e9es, elles peuvent prendre beaucoup plus de temps d\u2019ex\u00e9cution. Ici, je suis parti d&rsquo;une base vierge, un select devrait donc \u00eatre quasiment imm\u00e9diat. M\u00eame si ce ne sont pas les requ\u00eates les plus longues, comme elles sont ex\u00e9cut\u00e9es un grand nombre de fois, ce sont elles qui participent le plus au temps d&rsquo;ex\u00e9cution global sur la base de donn\u00e9es (environ 72% ici).<\/p>\n<p>Kestra a une impl\u00e9mentation asynchrone bas\u00e9e sur des queues de messages pour la communication entre ses composants internes, entre autre, lors de l&rsquo;ex\u00e9cution des flows. Quand le moteur base de donn\u00e9es est utilis\u00e9, ces queues vont faire des polls sur la table <code>queues<\/code> de la base de donn\u00e9es : toutes les 25ms une requ\u00eate sera ex\u00e9cut\u00e9e pour lire les messages \u00e0 traiter.<\/p>\n<p>Les quatre premi\u00e8res requ\u00eates en terme d&rsquo;ex\u00e9cution totale sont les requ\u00eates de poll, elles impactent donc directement le temps d&rsquo;ex\u00e9cution des flow.<\/p>\n<p>Il est possible de voir la requ\u00eates dans sa totalit\u00e9 en faisant un clic droit sur une ligne puis <strong>View SQL<\/strong>.<\/p>\n<p>Voici la requ\u00eate en question :<\/p>\n<pre>\nselect \"value\", \"offset\" from queues \nwhere ((type = CAST('io.kestra.core.models.executions.Execution' AS queue_type)) and \"consumer_scheduler\" = false) \norder by \"offset\" asc \nfetch next 100 rows only \nfor update skip locked\n<\/pre>\n<p>Un explain plan de cette requ\u00eate montre que, malgr\u00e9 la pr\u00e9sence d&rsquo;un indexe sur la colonne <code>queue_type<\/code>, l&rsquo;optimizer de PostgreSQL d\u00e9cide de faire un scan de l&rsquo;indexe de la primary key ce qui est suboptimal car il va scanner l&rsquo;int\u00e9gralit\u00e9 des enregistrements de cet indexe.<\/p>\n<p>PosgreSQL n&rsquo;ayant pas de hint, il est difficile de le forcer \u00e0 utiliser un indexe pr\u00e9cis. J&rsquo;ai donc utilis\u00e9 un petit workaround : j&rsquo;ai supprim\u00e9 la primary key et l&rsquo;ai replac\u00e9 par un indexe de hash (pour pouvoir acc\u00e9der rapidement \u00e0 un message lors de sa suppression). PostgreSQL privil\u00e9gie alors l&rsquo;indexe existant sur la colonne <code>queue_type<\/code>, et le temps d&rsquo;ex\u00e9cution de la requ\u00eate s&rsquo;en trouve grandement am\u00e9lior\u00e9 \u00e0 1ms environ.<\/p>\n<p>Si on regarde les top requ\u00eates, on voit que dor\u00e9navant nos 4 requ\u00eates ne totalisent plus que 23% du temps total d&rsquo;ex\u00e9cution.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-42-16.png?resize=640%2C373&#038;ssl=1\" alt=\"\" width=\"640\" height=\"373\" class=\"alignnone size-large wp-image-1658\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-42-16.png?resize=1024%2C596&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-42-16.png?resize=300%2C175&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-42-16.png?resize=768%2C447&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-42-16.png?resize=464%2C270&amp;ssl=1 464w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-42-16.png?w=1365&amp;ssl=1 1365w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-42-16.png?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Et le r\u00e9sultat est l\u00e0 ! Presque 50% d&rsquo;optimisation du temps d&rsquo;ex\u00e9cution d&rsquo;un flow en changeant un indexe. Pour plus d&rsquo;information voir la <a href=\"https:\/\/github.com\/kestra-io\/kestra\/pull\/1012\" target=\"_blank\" rel=\"noopener\">PR #1012<\/a> !<\/p>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Il y a peu, j&rsquo;ai d\u00e9couvert le profiler SQL de VisualVM et je me suis dit que je devais aussi vous le faire d\u00e9couvrir ;). VisualVM est un outil qui fournit une interface visuelle pour afficher des informations d\u00e9taill\u00e9es sur les applications qui s&rsquo;ex\u00e9cutent sur une machine virtuelle Java (JVM). VisualVM est con\u00e7u pour une utilisation au d\u00e9veloppement et en production. VisualVM fournit des outils de profiling l\u00e9ger dont un profiler SQL. Celui-ci va d\u00e9tecter chaque requ\u00eate SQL (passant par&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/le-profiler-sql-de-visualvm\/\">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":[203,211,159,213],"class_list":["post-1650","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-database","tag-kestra","tag-performance","tag-postgres"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1731,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/optimisation-dindex-postgresql\/","url_meta":{"origin":1650,"position":0},"title":"Optimisation d&rsquo;index PostgreSQL","author":"admin","date":"mardi 22 ao\u00fbt 2023","format":false,"excerpt":"Il y a quelque temps, j\u2019avais travaill\u00e9 sur des optimisations de temps d'ex\u00e9cution de requ\u00eates pour PostgreSQL, j'en parle ici : LE PROFILER SQL DE VISUALVM. Kestra est une plate-forme d\u2019orchestration et de scheduling de donn\u00e9e hautement scalable, qui cr\u00e9e, ex\u00e9cute, planifie, et surveille des millions de pipelines complexes. C\u2019est\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":1201,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/introduction-a-quickperf\/","url_meta":{"origin":1650,"position":1},"title":"Introduction \u00e0 Quickperf","author":"admin","date":"mardi  2 mars 2021","format":false,"excerpt":"QuickPerf est une biblioth\u00e8que de test pour Java permettant d'\u00e9valuer et d'am\u00e9liorer rapidement les performances de votre application. Le grand int\u00e9r\u00eat de Quickperf r\u00e9side dans le fait que cela s'effecue via des tests unitaires, ce qui permet, apr\u00e8s avoir d\u00e9tect\u00e9 et corrig\u00e9 un probl\u00e8me de performance, d'avoir des tests 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":685,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/optimisez-vos-options-avec-access-control-max-age\/","url_meta":{"origin":1650,"position":2},"title":"Optimisez vos OPTIONS avec Access-Control-Max-Age","author":"admin","date":"mercredi 12 avril 2017","format":false,"excerpt":"Bonjour, Aujourd'hui, je partage avec vous un header HTTP que je viens de d\u00e9couvrir : Access-Control-Max-Age. Aujourd\u2019hui, on execute des requ\u00eates Ajax (ou XHR) sans arr\u00eat, et souvent d'un site vers un autre. Pour des raisons de s\u00e9curit\u00e9, pour qu'une page puisse r\u00e9aliser une requ\u00eate Ajax vers un autre site,\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\/CORS_before.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/CORS_before.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/CORS_before.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/CORS_before.png?resize=700%2C400 2x"},"classes":[]},{"id":1611,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/introduction-a-kestra\/","url_meta":{"origin":1650,"position":3},"title":"Introduction \u00e0 Kestra","author":"admin","date":"lundi  6 mars 2023","format":false,"excerpt":"Kestra est un orchestrateur et scheduler de donn\u00e9e open source. Avec Kestra, les workflows de donn\u00e9es, appel\u00e9s flows, utilisent le format YAML et sont ex\u00e9cut\u00e9s par son moteur via un appel API, l'interface utilisateur, ou un trigger (webhook, schedule, SQL query, Pub\/Sub message, \u2026). Les notions importantes de Kestra sont\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\/kestra-01-1024x267.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-01-1024x267.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-01-1024x267.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"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":1650,"position":4},"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":827,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/devfest-lille-2018\/","url_meta":{"origin":1650,"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\/1650","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=1650"}],"version-history":[{"count":9,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1650\/revisions"}],"predecessor-version":[{"id":1665,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1650\/revisions\/1665"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}