présentation performances montpellier
DESCRIPTION
Présentation Performances Montpellier JUG Janvier 2013TRANSCRIPT
MontpellierJUG 16 Janvier 2013
goo.gl/4mmJQ
Performances
Claude Falguière @cfalguiere
http://fr.slideshare.net/claude.falguiere/prsentation-performances-montpellier
dimanche 20 janvier 13
CLAUDE FALGUIEREArchitecte technique
http://cfalguiere.wordpress.com
JUG Leader Duchess FranceLeader Devoxx4Kids FranceMembre du Paris JUG
@cfalguiere+Claude Falguiere
dimanche 20 janvier 13
Bob Alice
user experience
dimanche 20 janvier 13
dimanche 20 janvier 13
impressioncohérencestabilité
dimanche 20 janvier 13
vitesse
ou encombrement
ou capacité
Charles
dimanche 20 janvier 13
et disponibilité
dimanche 20 janvier 13
et efficacité
dimanche 20 janvier 13
gains
Optimisations
coût
Amazon :+100 ms -1% sales
Google : +500 ms –20% pages seen
dimanche 20 janvier 13
Dean
dimanche 20 janvier 13
We use the most performing frameworks !
Let’s upgrade the CPU
Let’s go to the Cloud
1
2
3Dean
dimanche 20 janvier 13
l’heure de vérité
MEP
dimanche 20 janvier 13
dimanche 20 janvier 13
Capacité
Concurrence - Locks
Lenteur d’un composant
dimanche 20 janvier 13
S3Quad-core 1.4GHz1Go
Nexus 10Dual-core 1,7 GHz2 Go
ServersQuad-Core Xeon 3,2 GHz8 / 64 Go
iPad4Dual-core 1.3GHz1Go
iPhone5Dual-core 1.02GHz1Go
iPhone4800 MHz512 Mo
MacBookAir Dual-Core i5 1,7 GHz4 Go
MacBookProQuadCore i7 2,3 GHz4 / 8 Go
HTC desire1 GHz576 Mo
BureautiqueCore i3 3GHz2 / 4 Go
dimanche 20 janvier 13
WIFI 802.11n2 600 Mbit/s théoriques
4G 1Gb à l’arrêt - 100Mb en mouvement
ADSL 8 Mbit/s4 Mbit/s à 4Km
Réseau local filaire 1 Gbit/s 500 Mbit/s
ADSL2+ 16Mbits/s (20Mbits/s ATM)5 Mbits à 10 Mbits
WIFI 802.11.b 11 Mbit/s 6 Mbit/s réels
WIFI 802.11.a / 802.11g 54 Mbit/s 25 Mbit/s réels
3G 1,9 Mbit/s 384 Kbit/s
3G+ 14,4 Mbit/s 7,2 Mbit/s (v6)
HSPA 42 Mbit/s 10 Mbit/s (v8)
LTE 326 Mbit/s 40 Mbit/s
2 Mbps 8 Mbps 16 MbpsMusique 5 Mo : 20 s 5 s 2.5 sVidéo 1.5 Go : 97 mn 24 mn 12 mn
dimanche 20 janvier 13
Essentiellement du scale outD’autres problèmes liés à la mutualisation Coût de la montée en charge
dimanche 20 janvier 13
Agréger des capacités à faible coûtMais la limite reste
dimanche 20 janvier 13
ressources limitées + non restituées = Famine
MémoireConnexion non rendue au pool Lock en interblocage
Les fuites
dimanche 20 janvier 13
Transactions (base de données) Synchronized (objets Java)
LockDeadlock ou livelock
Les locks
dimanche 20 janvier 13
Le volume
La répétition
Les timeout
Le fractionnement
L’algorithme
Les lenteurs
dimanche 20 janvier 13
iso-prod Test en charge
Test de vieillissement
Test à petite charge
Test à 1 utilisateur
Analyse de code
dimanche 20 janvier 13
tests en chargetest de concurrencetest de vieillissement
analyse de codemesure unitaire
dimanche 20 janvier 13
L’analyse statique de codeLes tests à 1 utilisateurs
dimanche 20 janvier 13
L’analyse statique de code
Sonar avec PMD et Findbugs
dimanche 20 janvier 13
Temps de réponse serveur
L’analyse d’une requête
dimanche 20 janvier 13
YSlow, PageSpeed Insights, GDT les proxy HTTP Charles, Fiddler
L’analyse du temps d’affichage
dimanche 20 janvier 13
HTTPPhases JSFDomainePersistance (JDBC)
Temps par couche {
L’analyse du temps serveur
dimanche 20 janvier 13
L’analyse du temps serveur
Access logs
Perf4J, JMX, MBeans, BTrace, logsDrivers JDBC virtuels (P6Spy, Log4JDBC)
Temps des requêtesTemps de service des disques
dimanche 20 janvier 13
L’analyse du temps serveur
dimanche 20 janvier 13
L’analyse de la base de données
Rapports sur les requêtes les plus longuesExplainIndexEviter les tris (order by, unions) et les cascade
Cache hit/miss
Passer 3 semaines de vacances avec la doc HibernateDéjeuner avec les DBA
dimanche 20 janvier 13
Le profilage du code Java
dimanche 20 janvier 13
Le profilage du code Java
Identifier Les opérations coûteuses ou répétées dans un use case Les opérations inutiles Les volumes pour chaque objet
Visualvm ou autre profiler
Scénario réaliste Volumes réalistes
dimanche 20 janvier 13
Les algorithmes naïfs sur des grands volumes
Les types de collections (List, Set) et l’implémentation Evaluer l’utilité des tris Eviter l’agrandissements de structure LinkedList, redimensionnement d’ArrayList
Points d’attention
dimanche 20 janvier 13
Les algorithmes
dimanche 20 janvier 13
Les caches
Le précalcul partiel (arbres de fenwick, raccourcissement d’arbre)
Les heuristiques
L’estimation de probabilité
Algorithmes et répétition
dimanche 20 janvier 13
Latence réseau, MTU
Buffers I/O
Facteurs de blocage SGBD : fetch size File systems : page size
Fragmentation d’espace, compactage
Fragmentations
dimanche 20 janvier 13
Tests simultanés à 2 utilisateurs
dimanche 20 janvier 13
Très faible consommation de ressources
Temps très longs (time-outs)
Affecte particulièrement certains use cases et à faible charge
Beaucoup de context switching
Indices de locks
dimanche 20 janvier 13
L’analyse des locks
thread dump
Au runtime JConsole, Visualvm Thread Dump + outil d'analyse (jvisualvm,TDA ...)
visualvm + plugin Threads
dimanche 20 janvier 13
Locker si nécessaire
Identifier les durée de vie des objets et leur scope
Utiliser les collections non synchronisées (List, Map)
Réduire la durée des locks
Points d’attention et pistes
Alternatives
Avoir une version par thread (Thread Local)
Déplacer le problème (volatile)
Immutabilité et persistent data
dimanche 20 janvier 13
Test de capacité en chargeTest de vieillissement
dimanche 20 janvier 13
LoadGenerator
dimanche 20 janvier 13
Projet Apache Jakarta
Scripts en XML (par IHM) + script lets (javascript, beanshell ... via JSR-223)
ExtensibleMultiprotocoleGestion des cookies et émulation du cache
http://jmeter.apache.org/
dimanche 20 janvier 13
dimanche 20 janvier 13
Vital
Frequent
Risqué
FrequentFrequent
FrequentQue font les utilisateurs
dimanche 20 janvier 13
Enregistrer
Thread Group
Logic Controller
Non Test Element
HTTP Proxy
HTTP Request
Sampler
HTTP Request
Sampler
dimanche 20 janvier 13
Thread Groups
dimanche 20 janvier 13
L’ordre de précédence
Logic Controller
Sampler
Configuration
Pre-Processor
Timers
Post-Processor
Assertion
Listener
configuration
mise à jour de paramètre
attente
requête
extraction de valeur
vérification
visualisation et reporting
TransactionController
IfController
WhileController
dimanche 20 janvier 13
Exemple
Logic Controller
Sampler
Configuration
Pre-Processor
Timer
Post-Processor
Assertion
Listener
Logic ControllerResponseAssertion
RegularExpression Extrator
User Variable
CSV Reader
View Result Tree
dimanche 20 janvier 13
l l
Gestion des mécanismes du navigateur
dimanche 20 janvier 13
Obtenir le résultat
dimanche 20 janvier 13
Debugguer
Insérer des échantillons de debogage dans les controllers
(Debug Sampler)
Enregistrer chaque action dans son TransactionController
Nommer les TransactionController
Activer la console
En charge Suivre le Thread Id Ajouter des variables à logguer
dimanche 20 janvier 13
Paramétrer
Données de datasource CSV
Extractor dans les PostProcessor
UserVariable
${nomVariable}
UserVariable passée au test
-J nomVar ou --addProp vars.properties
${__P(nomVar, valeurDefaut)}
dimanche 20 janvier 13
Vérifier les réponses
Assertions
sur le contenu
sur le nombre d’octets reçus
sur les entêtes HTTP
JMeter reporte automatiquement le code HTTP
dimanche 20 janvier 13
Régler l’allure
ThreadGroup
Nombre d’utilisateurs
Durée de la montée en charge
Délai de reflexion de l’utilisateur (ThinkTime)
Valider le nombre de samples réalisés
dimanche 20 janvier 13
En charge
--no-guiattention à la mémoire (conf de base -Xmx 1024m)
dimanche 20 janvier 13
Biais qui améliorent le résultat
Biais qui dégradent le résultat
dimanche 20 janvier 13
volumesscenario, données, mots clés
cachesdurée du test et vélocité
ignorer les erreursignorer les cas particuliers
SimplifierRanger
dimanche 20 janvier 13
qui fonctionne le mieux ?
A B
dimanche 20 janvier 13
Time Serie
and distribution
dimanche 20 janvier 13
Quelques mauvais temps
Temps instables
Bimodal !? ...
dimanche 20 janvier 13
identifier le coupable
dimanche 20 janvier 13
OPS
DEV
dimanche 20 janvier 13
Ernie
Fred
Greg
identifier le coupable
dimanche 20 janvier 13
Les goulets possibles
dimanche 20 janvier 13
Limites physiques
Mémoire / Disque ressource non partageable → erreur quand plus de ressources
CPU ressource en time sharing → partage excessif, lenteur
Réseau ressource en time sharing → idem + retry et écroulement
dimanche 20 janvier 13
CPU taux, longueur de la file d’attente, process runnable
Mémoire utilisation mémoire, swap-in
Réseaunombre de connexions établies nombre d’octets échangés entre les process
Disquelongueur de la file d’attente, octets lus/écrits, temps de service
Surveiller les ressources
dimanche 20 janvier 13
Limites logicielles
ulimit, quotas, shaping réseau
Les licences
Configuration mémoire de la JVM
Tailles limites de pool et de caches
dimanche 20 janvier 13
Apache module apache-status
JEE via JMX nombre d’éléments de pool actifs
nombre de connexions JDBC établies et activesnombre de messages dans les queues JMSMBeans HibernateMBeans des cachesVos MBeans
Base de donnéesNombre de requêtes, Locks, requêtes coûteuses
Surveiller les ressources
dimanche 20 janvier 13
Outils utiles
Collecteur : Nagios / Zabbix
Grapheur : Cacti / Graphite
JMX : JConsole, JMXTrans
Unix/Linux : sar + ksar / mnon, vmstat, iostat, netstat
Windows : perfmon, netstat
JVM : jstat, kill -3 (thread dump), Visualvm
dimanche 20 janvier 13
Les Application Performance Management JEE
JavaMelody (open source)
Introscope
PerformaSure
DynaTrace
NewRelic
JXInsight/OpenCore
AppDynamics
dimanche 20 janvier 13
adapter le comportement aux capacités
Le dimensionnement
dimanche 20 janvier 13
Les pools
dimanche 20 janvier 13
Tout ce qui rentre doit ressortir … en moyenne
Le pool est dimensionné par rapport aux ressources
Les files d’attente régulent les variations de débit
Pool
File d’attente
Les pools
dimanche 20 janvier 13
L’entonnoir
dimanche 20 janvier 13
-Xmx Heap
Mémoire de la JVM
dimanche 20 janvier 13
-Xmx
utilisé par le process
Core Stack
disponible sur la machine swap
Heap
Mémoire de la JVM
dimanche 20 janvier 13
JVMTI & JMVPI via JMXLog -verbose:gc + outils type GCViewervisualvmjstat avec les options gcjmap et jhatjClarity Censum (payant)
GC overhead < 5% (temps overhead / uptime)Activité CPU élevée
L’analyse de la mémoire
dimanche 20 janvier 13
Visualvm
(plugin visualgc)
dimanche 20 janvier 13
GCViewer
Log -verbose:gc
dimanche 20 janvier 13
Profilage mémoire
Objets présents en grande quantité et en croissance
Difficiles de distinguer les fuites des caches tips : les fuites ont un nombre de générations élevé
dimanche 20 janvier 13
Tester, Tester, Tester
Mesurer, Mesurer, Mesurer
Comprendre
Il n’y a pas de potion magique
dimanche 20 janvier 13
Kirk Pepperdine Blog Java Performance TuningDevoxx 2012 Performance Optimization Tuning
Aleksey Shipilev performance mindmap devoxxhttp://shipilev.net/pub/talks/devoxx-Nov2012-perfMethodology-mindmap.pdf
Quelques lectures
JMeterhttp://blog.milamberspace.net/
dimanche 20 janvier 13