Perfug BOF devoxx2017.pptx

39
BOF Performance User Group

Transcript of Perfug BOF devoxx2017.pptx

Page 1: Perfug BOF devoxx2017.pptx

BOF Performance User Group

Page 2: Perfug BOF devoxx2017.pptx

Le perfUG c’est :• Offrir un lieu d’échanges

informels ouvert à toutes les personnes intéressées par l’optimisation et la performance, quel que soit leur niveau

• Faciliter la diffusion des derniers outils et des meilleures techniques pour maîtriser la performance

La session s’est terminée par :• Des éléments de méthode• Un hands-on pour mettre en

pratique

#1 Inauguration du Performance User Grouppar Henri Tremblay @henri_tremblay et Marc Bojoly @mbojoly

Page 3: Perfug BOF devoxx2017.pptx

La mesure doit être au coeur de la démarche de performance

Un outil : l’APM - Application Performance Management

Un éditeur : AppDynamics qui s’est fait connaître par son adoption chez Netflix

Une coding session pour visualiser :• Un appel à une application

externe• Un Lock• Du context switching lié à des

appels à la base de données

#2 AppDynamicspar Alexandre Méchain @Alexandremecha2 et Marc Bojoly @mbojoly

Page 4: Perfug BOF devoxx2017.pptx

Évaluer les performances unitaires du système (CPU, RAM, I/O) pour• Choisir au mieux un composant

technique ?• Tester une hypothèse d’architecture ou

de tuning ?• Prévoir le capacity planning et le TCO

Tester par comparaison avec de l’outillage simple :• CPU : openssl speed, sysbench• RAM : bandwidth• I/O : bonnie++, iozone• HTTP : apache benchmark, wrk

#3 La perf système pour les nulspar Ludovic Piot @lpiot

Page 5: Perfug BOF devoxx2017.pptx

Avec l’expérience beaucoup de problèmes de performance reviennent encore et encore

Kirk Pepperdine, Java Champion a capitalisé sa connaissance dans l’outil Illuminate (ex-JClarity)

Quelques exemples de problèmes classiques

• Trop de Garbage Collection• Trop de context switching créé par

des locks• Des attentes vers des systèmes

externes• Trop peu de threads

#4 JClarity (Illuminate)par Kirk Pepperdine @javaperftuning

Page 6: Perfug BOF devoxx2017.pptx

Comprendre le réseau et sa performance :• Latence, bande passante, taux d’erreur,

duplex, MTU, jitterProtocoles• UDP, TCP• Congestion windows & time to load

Outils• ping, traceroute, tc…

Tuning & tips• Linux : windows, MTU, slow-start• Attention : VPN, lazy joins, content ratio• Cache, réutilisation de connexions

#5 NEED FOR SPEED: PACKET EDITIONPRIMER TO NETWORK PERFORMANCE FOR NORMAL PEOPLE

par Raphaël Luta @raphaelluta

Page 7: Perfug BOF devoxx2017.pptx

Gatling est un outil pour simuler de la charge sur une application

• En mode acteur• Avec un DSL scala en lieu et

place d’une interface graphique• Mais avec un beau rapport de

résultat

Stéphane nous a ensuite présenté le fonctionnement interne de Gatling et les choix d’implémentation pour 2014 (à base de Monad)

• l’API de validation à base de Monad

• La nouvelle API session• Et plein d’autres (anciennes

nouveautés)

#6 Gatlingpar Stéphane Landelle @slandelle

Page 8: Perfug BOF devoxx2017.pptx

Une session pratique sur Jprofiler avec une application truffée de bugs activables via JMX :• Un pool JDBC mal tuné• Une requête SQL qui renvoie la base

entière• N+1 requêtes sur JPA• Des méthodes synchronized• Un pool de threads mal configuré dans

le serveur d’application• Une fuite mémoire sur les sessions

Tomcat• Beaucoup trop de logs• Trop exceptions !• Un GC mal configuré• Un pool JDBC refait à la main• Et on n’a pas eu le temps de tout voir !

#7 JProfilerpar Brice Leporini @blep et Florent Ramière @framiere

Page 9: Perfug BOF devoxx2017.pptx

Une architecture innovante pour recevoir en temps réel des informations de capteur à haute fréquence

Une approche event-driven, asynchrone, qui optimise l’utilisation du CPU en travaillant avec un seul thread

Une stack Scala, Akka, MongoDB, MySQL Redis

Des surprises : le système déborde !Une architecture pour de très hautes

volumétries : près de 5 000 msg/s. en mode asynchrone

#8 La programmation Reactivepar Emmanuel Fortin @fortemm et Philippe Prados @pprados

Page 10: Perfug BOF devoxx2017.pptx

Prismic.io est un CMS stateless

Il offre aux développeurs des API afin de récupérer le seul contenu nécessaire

Son architecture sépare totalement la writing room de l’API pour pouvoir héberger rapidement en mode SaaS plusieurs milliers de repositories

#9 Prismic.iopar Guillaume Bort @guillaumebort et Sadek Drobi @sadache

Page 11: Perfug BOF devoxx2017.pptx

Hadoop : un cluster de stockage (HDFS) et de traitement. Comment améliorer ses performances ?

Un réseau dédié, des machines homogènes et MESUREZ !

MAP : • Blocs de 64 bits• Sérialisation• Format Colonnar pour ne récupérer

qu’une partie des données• Eviter le spilling sur le disque

REDUCE• Combiner, compression, partitionnement• Optimiser le nombre de threads pour

récupérer les données• Eviter le spilling sur disque• Optimiser les RecordWriters• Préparer les data pour le requêtage

(Hive)

#10 Hadooppar Sofian Djamaa @sdjamaa

Page 12: Perfug BOF devoxx2017.pptx

System.nanoTime() pour mesurer le temps d’exécution de votre méthode ? N’y pensez même pas !

Java Microbenchmarking Harness est conçu pour prendre en compte les optimisations de la JVM

Il est important de bien prendre en main les exemples pour maîtriser les réglages possibles pour contourner les optimisations de la JVM (inlining, suppression de méthodes non utilisées…)

Henri a terminé par un benchmark entre Easy Mock et Mockito

#11 JMHpar Henry Tremblay @henri_tremblay

Page 13: Perfug BOF devoxx2017.pptx

Les CPU embarquent un Processor Monitoring Unit qui peut monitorer

• Les cycles• Les instructions• Les caches• Les accès mémoire (et au cache)Outil linux : perfPerf list liste les compteurs disponibles

(ex. LLC-Load-misses pour les cache misses)

Overseer : librairie Java qui permet de programmer tous les compteurs disponibles et de profiler précisément des portions de code d’applications

#12 Les Unités de mesure des CPUpar Jean-Philippe Bempel @jpbempel

Page 14: Perfug BOF devoxx2017.pptx

Comment optimiser basiquement les performances de son application web ?

Au niveau serveur :• Concatenate, Compress, Cache

Au niveau des images• Comprimer, utiliser les spritesAu niveau du javascript• Mettre <script> en base de page

et utiliser les attributs defer et async

Au niveau CSS• Limiter au maximum les reflow, et

suivre quelques bonnes pratiques pour le parseur CSS

Au niveau de la perception• On peut tricher ! ..

#13 WebPerfpar Timothée Carry @pixelastic

Page 15: Perfug BOF devoxx2017.pptx

La finance de marché vulgarisée c’est comme un super marché : on va faire un Pasta Pricer !

Différents approches : mono-thread, multi-thread, pool de threads

Comment rendre la programmation réactive accessible à tous et sans danger ?

Avec la librairie Michonne qui encapsule 2 patterns

• Sequencer• Conflation

Conseil : éviter les buffers intermédiaires qui créent du retardLe réactif n’est pas une panacée, c’est une forme particulière de design

#14 Latences basses, haut débit : Les secrets de la Finance pour avoir des systèmes réactifs

par Thomas Pierrain @tpierrain et Cyrille Dupuydauby @Cyrdup

Page 16: Perfug BOF devoxx2017.pptx

LoadRunner est l’outil de test de charge proposé par HP

Proposé sous Windows, il offre un service complet de test de charge avec :

• Un outil de capture• Un Virtual User Generator• Un outil de design pour le tir• Des machines d’injection• Un outil de collecte• Un outil d’analyseLe principal différenciant de Load

Runner est son support de très nombreuses technologies (HTTP, Base de données, Ecran caractère…)

LoadRunner offre une version gratuite jusqu’à 50 utilisateurs simultanés

#15 HP Load Runnerpar Guillaume Alex

Page 17: Perfug BOF devoxx2017.pptx

Dynatrace est un outil d’APM (Application Performance Management)

Sa philosophie est de fournir la vision la plus détaillée possible tout en offrant une finesse de configuration pour limiter l’impact sur les performance

Dynatrace s’étend avec une offre RUM (Real User Monitoring) avec des mesures de ressenti depuis le navigateur

#16 Dynatrace pour monitorer vos problèmes de performancepar Antonio Gomes Rodriguez @ra0077

Source : https://community.dynatrace.com/

Page 18: Perfug BOF devoxx2017.pptx

#17 Phaser and StampedLock Concurrency synchronizerspar Heinz Kabutz @heinzkabutz

Les synchronizers • Maintiennent un état mutable cohérent• Encapsulent un état qui déterminent si

le thread qui arrive doit attendre ou passer

Comment utiliser les différents synchronizers

• CountDownLatch (attention aux interruptions)

• Phaser (plus simple à utiliser)• ReadWriteLock (Java 6)• ReentrantLock (attention au try/finally)• StampedLock (plus performant mais

plus difficile à écrire)Comment bien utiliser les locks ?

• Eviter au maximum les locks en écriture (cf. exemples)

Page 19: Perfug BOF devoxx2017.pptx

#18 JDBC / JPA / Hibernatesans maîtrise la puissance n’est rien

par Brice Leporini @blep

JPA est largement utilisé dans les développements Java

Mais les erreurs en matière de performance sont aussi très fréquentes

Quelques florilèges des erreurs les plus fréquentes durant la session

• La mauvaise compréhension du fonctionnement de l’entity manager

• Le N+1 requêtes• La méconnaissance des Named

Queries et de l’API criteria• Un pool JDBC mal configuré

Page 20: Perfug BOF devoxx2017.pptx

#19 Fast Data Pipelines with Kafkapar Sam Bessalah @samklr

Kafka est un moteur de messaging distribué à fort débit, pub/sub, faible latence

Pourquoi Kafka est rapide• Kernel Page Cache• Zero copy (Sendfile API)• Ecritures séquentielles• Dumb Brokers• Pulling Customers

Performance Gotchas• Consumer Lag• Rebalancing

Page 21: Perfug BOF devoxx2017.pptx

#20 Riemannpar Yann Schwartz @abolibibelot

Chez Criteo l’ingestion de logs pose des soucis d’échelle

Graphite < 100 000 métriques par seconde

Les solutions type rsyslog présentaient des limites en terme de souplesse et de performance

Riemann est un event stream processor

• Il n’est pas distribué• Il stocke aussi peu d’état que

possibleIl permet de traiter jusqu’à 200 000 métriques par secondeIl filtre, combine, modifie le flux pour comprendre le système

Source : http://riemann.io

Page 22: Perfug BOF devoxx2017.pptx

#21 Programmation lock free : les techniques des propar Jean-Philippe Bempel @jpbempel

Réduire la contention pour une meilleure scalabilitéMesure de la contention: JProfiler, JVMTIStratégies :• CopyOnWrite• Lock Striping• Compare-And-Swap• Barrière mémoireStructures :• Disruptor : un Ring Buffer permettant d’avoir

différentes stratégies (ex. N P, 1C) et très performant (lock-free, peu d’allocation)

• JCTools : Files lock-free avec un degré fin de choix

• OrderedScheduler : une structure lock free for garantir qu’un couple de traitements se fera dans le même ordre

Les stratégies d’attendre• Wait (latence)• Spin (faible latence mais brûle un core)

Page 23: Perfug BOF devoxx2017.pptx

#22 NGNIX par Bastien Fiorentino

JVM OFF-HEAP et architecture NUMA par Gaëlle Guimezanes @gguimezanes

Un serveur en France. Des clients en Asie. 7 s. De temps de réponse

586 ms. de latence réseauComment optimiser simplement ?Avec un reverse proxy NGINX pour optimiser

le nombre de connexions et en faisant du cache

Au final 2 s. pour le chargement

QuartetFS : plusieurs TB en mémoire et des serveurs NUMA

Pour cela on stocke en off-heap en compressant les données (dictionnarisation)

En NUMA la mémoire est partitionnée : comme en map reduce on fige des pools de threads responsables d’une partition et figés au plus prêt de la partition

Page 24: Perfug BOF devoxx2017.pptx

#23 Les secrets de la JVM pour les algos à haute fréquencepar Philippe Prados @pprados

Un algorithme haute fréquence doit exploiter au mieux les architectures des processeurs : la mémoire, la gestion des verrous, les caches

1) L’assembleur2) L’exploitation des caches3) Compare and Set4) Framework : Conteneurs immuables

pour éviter l’éviction des caches, Transaction en mémoire

5) Autres : Affinité avec les sockets (OpenHFT), synchronize est optimisé

6) Conteneurs lock-free

Page 25: Perfug BOF devoxx2017.pptx

#24 Deep into your native applicationpar Fabien Arcellier @farcellier

2 types de profiling sur les applications natives

• Le profiling par instrumentation (gprof, callgrind) : précis mais pénalisant !

• Le profiling par échantillonnage (perf, Oprofile, Intel VTune) : peu pénalisant mais on peut rater des éléments

• Les outils à retenir : perf & flamegraph

• Et une demo !

Page 26: Perfug BOF devoxx2017.pptx

#25 HTTP the next generationpar Raphaël Luta @raphaelluta

HTTP est le protocole applicatif le plus populaire bien qu’il soit lent inefficace et complexeHTTP la suite : Server-sent event Websocket… avec une compatibilité faibleHTTP/2 :

• Trames binaires• Compression des headers• Multiplexing de flux sur une connexion

TCPGain typique de l’ordre de 20%Utilisation avancées possibles : contrôle de cache client, priorisation, messaging asynchroneAsync messaging mais non compatible avec les WebSocketsQUIC : HTTP/2 over UDP

Page 27: Perfug BOF devoxx2017.pptx

#26 Measuring Front-End performance par Gareth Hughes

High performance image par Tobias Baldauf (@tbaldauf)

Décidez en amont de vos objectifs de performance d’affichage à atteindreA toute les phase du cycle de développement mesures, instillez la culture de la performanceEn utilisant des outils de mesure et de reporting pour avoir agir à partir d’infos du terrrain (sondes, RUM, profilers)

Les images sont la cause principale de lenteurs des sitesPour l’améliorer travailler le format !Compressez vos JPEG avec mozjpeg et utilisez cjpeg-dessim ou Adept Suivez le développement de JPEG XTT

Page 28: Perfug BOF devoxx2017.pptx

#27 Comment ne plus ajouter de RAM à vos JVM sans savoir pourquoi

par Philippe Kernevez @pkernevez

La gestion de la mémoire en Java : s’il y a une fuite mémoire c’est forcément qu’il est référencé dans le code

3 zones mémoires : Young/Tenured/PermUn GC survient lors d’un échec d’allocationLors d’un GC les objets survivants sont promus dans la

zone suivanteTenured Promotion : des objets référencés par des objets

déjà dans la zone tenured peuvent être promus à tortUne partie du GC est bloquant pour la JVMDes reference card sont posés lors de la création de

références pour éviter d’avoir à parcourir toute la mémoire

VisualVM• Permet de visualiser les GC et leur évolution• En direct seulement

HPJMeter (gratuit) ou Censum (payant)• Permet d’analyser les logs GC sur des temps plus

long• Visualise le taux d’allocation, les quantités mémoires

avant/après, la distribution des objets par génération...MemoryAnalyzer

• Permet d’analyser des heapdumps• Utiliser le dominator tree puis la liste des objets

Page 29: Perfug BOF devoxx2017.pptx

#28 Comment tester et optimiser la performance d’un SIpar Cyril Picat @cyrilpicat et Marc Bojoly @mbojoly

REX d’un projet de migration de SI bancaire

1 : chasser les idées reçues2 : s’adapter à la réalité - des outils

simples (analyse de logs, outils système) - et quelques pré-requis intangibles (environnement opérationnel isolé, un jeu de données minimal)

3 : cadrer le chantier face à des problèmes vertigineux

4 : tester les systèmes indépendamment pour réduire la complexité

5 : utilisez intelligemment les tests de charge et d’autres outils

6 : quelques tests end-to-end sont indispensables mais restez simple (ex. Pic de transaction, rejeu d’une journée)

Page 30: Perfug BOF devoxx2017.pptx

#29 Créer une API distribuée mondialement sans utiliser (ou presque) le cloud

par Sylvain Utard @sylvainutard

Algolia : un search as a service pour l’intégrer dans son site web. La performance est dans l’ADN d’Algolia (11 milliards de recherches utilisateurs par mois, 36 datacenters et 400 machines)

Hautement disponible grâce des un cluster de 3 machines en réplication master master (consensus distribué implémenté avec RAFT)

Sans load balancer ! C’est le client qui le faitL’index est également répliqué dans différents datacenters

répartis dans le mondeChoix du bare-metal• Besoin d’un CPU peu courant (8 à 12 threads) au moins

3,5 GHz - Intel E5-1650v3• RAM ECC 1600 ou 2400 MHz.• SSD Intel S3710 : les disques mourraient tous les 3 mois• Réseau : il faut pouvoir choisir la localisation des

machines !Le Cloud avec ces contraintes : beaucoup trop cher !

• AWS : 1700 $ /mois• Provider classique : 160 ou 385 $ / mois

Mais beaucoup plus de contraintes opérationnelles

Page 31: Perfug BOF devoxx2017.pptx

#30 Scaldingpar Sofian Djamaa @sdjamaa

Scalding : une API Scala pour écrire du MapReduce

• Au dessus de cascading et Hadoop MapReduce

Scalding fait un plan d’exécution pour réduire le nombre de jobs map/reduceLa réécriture de la requête permet de le réduire encore plus

• Optimiser avec des combiners (sommes les clés en local)

• Traiter en mémoire ce qui est possibleOn optimise ensuite les reducers

• Optimiser le nombre de reducers• Vérifier que les traitements se font en

mémoire

Page 32: Perfug BOF devoxx2017.pptx

#31 Latency: from dream to nightmare in 100 ms.par Adam Surak @AdamSurak

Latence Paris New-York : 39 ms. en théorie, 85 ms. en pratique

Les millisecondes sont importantes pour un moteur de recherche comme Algolia

Leur donnée est répliquée 3 fois dont 2 fois de façon asynchrone dans un autre datacenter

Mais Internet n’est pas optimisé pour la latence

• Il ne suit pas la géographie• Il est fortement asymétrique

Ce sont des problèmes complexes à résoudre : c’est toujours le problème des autresMonitorer toujours votre réseau

Page 33: Perfug BOF devoxx2017.pptx

#32 OutOfMemoryException : quel est le coût des objets en Javapar Jean-Philippe Bempel @jpbempel

Comment diagnostiquer des problèmes mémoire liés à la taille des objets ?

java.lang.Object (header pour tous les objets) : 16 bytes en 64 bits

CompressedOops : stockage de l’adresse sur 32 bits jusqu’à 32 GB de mémoire

Padding : espace perdu ! (alignement par 8 bytes = 64 bits)

Un outil Java Object Layout

Diagnostic & War Stories20 GB de HashEntries !18 GB de String[]Measure, don’t premature

Page 34: Perfug BOF devoxx2017.pptx

#33 Guide de survie d’un développeur dans une application qui rame

par Brice Leporini @blep

Collecter les données de l’environnement concerné

Si vous soupçonner des problèmes mémoire: jstat -gcutil

Et apprenez à maîtriser le GC !Si la mémoire est trop grosse jmap -dump… + Memory Analyzer Tool

Sinon il faut savoir ce que fait l’application jstack <pid> + Thread Dump Analyzer

Tuner votre pool de threadsEnfin vérifier les IO (disque ou requêtes SQL)

Page 35: Perfug BOF devoxx2017.pptx

#34 GPGPU en .NETpar Mick Philippon @MickPhilippon

GPGPU : le processeur des cartes graphique

Optimisé pour réalisé en parallèle un très grand nombre de calculs (sur les shaders normalement)

Peut être détourné pour faire du calcul intensif

Algorithme de Krager : un algorithme probabiliste pour déterminer la coupe minimale dans un graph

Demo en C# avec Cudafy.netRéponse : le GPGPU n’est pas adapté pour ce type de calculBeaucoup plus efficace pour faire le même calcul sur des données de taille fixe

fonction contraction(G=(V,E)): tant que |V| > 2 choisir e dans E aléatoirement (*fonction aléatoire uniforme*) G ← G/e retouner l'unique coupure de G

Source : https://fr.wikipedia.org/wiki/Algorithme_de_Karger

Page 36: Perfug BOF devoxx2017.pptx

#35 WebPerf : quoi de neuf ?par Stéphane Rios @stefounet

Comment afficher quelque chose d’utile le plus rapidement possibleDes règles de base écrites avant le mobile !Latence mobile : 3G 200 - 3500 ms. Pour aller plus loin

• Cacher• JS asynchrone ou defer• Lazyloading• Chargement asynchrone de font• Et HTTP/2

QUIC pour remplacer TCPServices Workers : à creuser pour optimiser les appels réseauOptimiser TLSNouveaux formats d’image : MozJPEG, DSSIM

Nouvelles règles :• Preloader : le navigateur va essayer de précharger

les objets. Ne pas lui masquer• Concaténation : trouver un intermédiaire (taille,

maintenabilité)• Sharding des objets statiques : attention à la latence

DNS• Lazy loading: à limiter aux images en dessous de la

ligne de flotaison• JS en bas : le remplacer par des JS asynchrone• Minification : BOF

Page 37: Perfug BOF devoxx2017.pptx

Vous en voulez encore ?

Page 38: Perfug BOF devoxx2017.pptx

#36 HTTP/2 pour (micro)-servicespar Raphaël Luta @raphaelluta

HTTP/2 est-ce utile dans mon datacenter ?

Avantages HTTP/2 : binaire, headers compressés, multiplexing et push server

h2c : HTTP/2 sans SSLArchitecture cible : proxies et serveursHTTP/2 : les requêtes peuvent être

mélangées (contrairement au HTTP/1 pipelining)

Sur HTTP/1.1 en serial les requêtes s’accumulent

Mais en HTTP/2 c’est plus dur à tuner

Page 39: Perfug BOF devoxx2017.pptx

Et pourquoi pas vous ?

Intéressés ? Consultez• @PerfugParis• http://perfug.github.io

–Avec les vidéos des sessions

Intéressez pour nous aider ? • Venez speaker• Proposez nous des speaker