Archives de
Tag: performance

jOOQ tip: ne convertissez pas JSONB en String

jOOQ tip: ne convertissez pas JSONB en String

Il y a quelques semaines, en investiguant de possibles améliorations de performance pour le backend JDBC de Kestra, j’ai remarqué qu’une méthode qu’on utilisait pour mapper une entité à persister en base de données dans sa représentation JSONB prenait beaucoup de temps dans nos profiles CPU. Dans le flame graph suivant, on peut voir que la méthode JdbcQueue.map() compte pour plus de 21% des échantillons et la méthode Repository.map() pour 3.2% des échantillons d’un profile CPU utilisant async-profiler. Ces deux…

Lire la suite Lire la suite

Optimisation d’index PostgreSQL

Optimisation d’index PostgreSQL

Il y a quelque temps, j’avais travaillé sur des optimisations de temps d’exécution de requêtes pour PostgreSQL, j’en parle ici : LE PROFILER SQL DE VISUALVM. Kestra est une plate-forme d’orchestration et de scheduling de donnée hautement scalable, qui crée, exécute, planifie, et surveille des millions de pipelines complexes. C’est aussi la société dans laquelle je travaille ! Kestra, en version open source, utilise un moteur base de données, l’Edition d’Entreprise permet d’utiliser un moteur alternatif basé sur Kafka et…

Lire la suite Lire la suite

Le profiler SQL de VisualVM

Le profiler SQL de VisualVM

Il y a peu, j’ai découvert le profiler SQL de VisualVM et je me suis dit que je devais aussi vous le faire découvrir ;). VisualVM est un outil qui fournit une interface visuelle pour afficher des informations détaillées sur les applications qui s’exécutent sur une machine virtuelle Java (JVM). VisualVM est conçu pour une utilisation au développement et en production. VisualVM fournit des outils de profiling léger dont un profiler SQL. Celui-ci va détecter chaque requête SQL (passant par…

Lire la suite Lire la suite

Profiler une application Java dans un conteneur déployé dans kubernetes avec JFR – Java Flight Recorder

Profiler une application Java dans un conteneur déployé dans kubernetes avec JFR – Java Flight Recorder

La plupart des clients chez lesquels j’interviens aujourd’hui utilisent Kubernetes pour déployer 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é quant aux moyens de « regarder » le comportement de nos applications en cours de fonctionnement. Quand j’ai un problème de performance sur une application, j’utilise régulièrement un profiler Java. Il en existe de nombreux, mais…

Lire la suite Lire la suite

Introduction à Quickperf

Introduction à Quickperf

QuickPerf est une bibliothèque de test pour Java permettant d’évaluer et d’améliorer rapidement les performances de votre application. Le grand intérêt de Quickperf réside dans le fait que cela s’effecue via des tests unitaires, ce qui permet, après avoir détecté et corrigé un problème de performance, d’avoir des tests de non-régression pour que celui-ci ne revienne jamais ! Vous pouvez alors évaluer en continue les performances de votre application via votre environnement d’intégration continue ! Quickperf peut être utilisé pour…

Lire la suite Lire la suite

Benchmark : conversion de long en byte[]

Benchmark : conversion de long en byte[]

J’utilise beaucoup Kafka ces derniers temps, et dans Kafka, beaucoup de choses sont des tableaux de bytes, même les headers ! Comme j’ai de nombreux composants qui s’échangent des messages, j’ai ajouté des headers pour aider au suivi des messages, et entre autres un header timestamp qui a comme valeur System.currentTimeMillis(). Il m’a donc fallut transformer un long en tableau de byte; d’une manière très naïve, j’ai codé ça : String.valueOf(System.currentTimeMillis()).getBytes(). Mais instancier une String à chaque création de header…

Lire la suite Lire la suite

Profiler une image native GraalVM avec perf

Profiler une image native GraalVM avec perf

L’outil GraalVM native-image permet de générer un exécutable natif (ou image native) depuis votre application Java. Cet exécutable natif va démarrer très rapidement et avoir une empreinte mémoire beaucoup plus faible qu’une application Java traditionnelle; au prix de performances en pic réduites et d’un temps de création de ce package natif assez élevé. Plus d’informations sur les exécutables natifs ici. Un exécutable natif contient une JVM minimaliste appelée SubstratVM, celle-ci a quelques limitations : Support partiel de la reflection Support…

Lire la suite Lire la suite

Quarkus, jlink et Application Class Data Sharing (AppCDS)

Quarkus, jlink et Application Class Data Sharing (AppCDS)

Quarkus est optimisé pour démarrer rapidement et avoir une empreinte mémoire très faible. Ceci est vrai en déployant dans une JVM standard mais encore plus en déployant notre application comme un exécutable natif via GraalVM. Quarkus facilite grandement la création d’exécutable natif, grâce à ça, une application Quarkus démarre en quelques dizaines de millisecondes et avec une empreinte mémoire très faible : quelques dizaines de Mo de RSS (Resident Set Size – totale d’utilisation de mémoire du processus Java vu…

Lire la suite Lire la suite

Introduction à JMH – Java Microbenchmark Harness

Introduction à JMH – Java Microbenchmark Harness

Dans mon précédent article For vs Stream, j’ai utilisé JMH – The Java Microbenchmark Harness, un outil pour réaliser des microbenchmarks de manière facile, et surtout, pertinente. Cet article à pour but de vous présenter l’outil et son utilisation. Mais tout d’abord : c’est quoi un microbenchmark ? Microbenchmark Benchmark ou banc d’essai en français : un programme qui permet de mesurer les performances d’un système, pour le comparer à d’autres. Microbenchmark : un benchmark fait pour mesurer les performances…

Lire la suite Lire la suite

For vs Stream

For vs Stream

Cela faisait longtemps que je n’avais pas écrit un article de blog et pourtant, pour cause de confinement, j’ai du temps pour le faire! N’ayant pas d’idée, j’ai demandé à ma twitosphère de m’en donner, et j’ai eu une réponse intéressante : Les différences de perf entre stream et for classique ? On en a parlé y’a longtemps, mais j’avais fait une session de micro bench avec JMH qui montrait que les ‘for’ étaient plus performants que les streams. —…

Lire la suite Lire la suite