how to fail at benchmarking?
TRANSCRIPT
@pingtimeout#FailAtBenchs
Comment rater ses benchmarks ?
Pierre Laporte Ingénieur performances - Datastax
@pingtimeout [email protected]
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Agenda
• Intro
• Pourquoi cette session ?
• Comment se planter ?
• Que mesurer ?
• Comment mesurer ?
• « Coordinated Omission » ?
• Quel état d’esprit ?
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Intro
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Cassandra
• NoSQL
• Scalabilité linéaire
• Toujours disponible
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Datastax Enterprise (DSE)• Plateforme complète
• Certifiée
• Sécurisée
• Search (Apache Solr)
• Analytics (Hadoop, Spark)
• Simplicité opérationnelle (OpsCenter)
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Pourquoi ce talk ?
@pingtimeout#FailAtBenchs
I have not failed, I have just found 10,000 ways that won't work.
- Thomas Edison
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Progresser
Faire des erreursTrouver des solutions
Ne pas blâmer
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Comment se planter ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Exemple
• Bench d’une API REST : POST /login
• 100.000 logins
• 1 utilisateur
• Temps de réponse de chaque login
• Mesure dès le premier résultat
• Une exécution (longue)
• Sur un portable de dev
• Moyenne des résultats
• Projection utilisation CPU <=> Capacité restante
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Caches
• « 100.000 logins d’un unique utilisateur »
• Caches CPU (L1, L2, L3, …)
• TLB
• Cache de Base de Données
• Cache Hibernate (query, L2, …)
• …
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Précision d'horloge
• « Temps de réponse de chaque login »
• login ~> 5ms
• System.currentTimeMillis() ~> 1ms
• ±1 <=> ±20%
• System.nanoTime() "provides nanosecond precision, but not necessarily nanosecond resolution »
• Source: Javadoc
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Temps de chauffe
• « Mesure dès le premier résultat »
• Chargement des classes
• Profiling du code
• Optimisations (Inlining, compilation, élimination de locks, …)
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Confiance dans les résultats
• « Une exécution (longue) »
• Bruit de fond ?
• Compétition ?
• Quelle confiance dans les mesures ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
• « Sur un portable de dev »
Environnement
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
• « Sur une seule machine »
Environnement
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Métriques
• « Moyenne des résultats »
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Projection de capacité
• Utilisation CPU ≈ 50%
• Capacité restante ≈ … ?
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Que mesurer ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Moyenne
• Supprimer les points gênants
• « Moyenne de deux nombres » = … ?
• Pourquoi l’utilise-t-on ?
• Est-ce suffisant ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Métriques utiles
• Histogramme
• Centiles
• 90ème
• 95ème
• 99ème
• …
• Maximum
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Combien de 9 ?
• 99% ?
• 99,99% ??
• Ça dépend.
• Pour 500 utilisateurs
• 99% signifie… ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Combien de 9 ?
• Si 1.000.000 utilisateurs
• 99% signifie… ?
• 10.000 utilisateurs.
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Comment font les autres ?
• 5.000.000 joueurs simultanés
• 12.000.000 par jour
• 67.000.000 par mois• Quels centiles mesurer ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Maximum
• « Boarf, surement un timeout, on peut l’ignorer »
• Random dev devant un temps de réponse de 60s
• Acceptable ?
• Temps réel ?
• Jeux vidéo ?
• Appli mobile ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Genèse d’un benchmark
• Une question bien spécifique
• Des exigences précises
• Exemple
• Site de e-commerce
• « Avec mes 5 serveurs d’application, 20.000 articles en base, et 1.000 clients simultanés, est-ce que la commande d’article prend moins de 50ms en moyenne, 100ms une fois sur 10 et 300ms au pire ? »
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Environnement
• « Avec mes 5 serveurs d’application, 20.000 articles en base, et 1.000 clients simultanés, est-ce que la commande d’article prend moins de 50ms en moyenne, 100ms une fois sur 10 et 300ms au pire ? »
• POC:
• TomEE
• Glassfish
• Weblogic
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Charge
• « Avec mes 5 serveurs d’application, 20.000 articles en base, et 1.000 clients simultanés, est-ce que la commande d’article prend moins de 50ms en moyenne, 100ms une fois sur 10 et 300ms au pire ? »
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Exigences
• « Avec mes 5 serveurs d’application, 20.000 articles en base, et 1.000 clients simultanés, est-ce que la commande d’article prend moins de 50ms en moyenne, de 100ms une fois sur 10 et de 300ms au pire ? »
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Épilogue d’un benchmark
• Réponse obtenue
• Satisfaisante… ou pas.
• Résultats Contextuels
• Environnement
• Charge
• Contraintes
• Compromis
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Vérités statistiques
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
99ème centile en moyenne
• Application typique en 2012
• 100 « Web objects »/page
• ≈ 100 requêtes HTTP/page
• Probabilité d’éviter le 99ème centile ?
• 0.99n, sur n requêtes
• 0.99100 ≈ 36.6%
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
La loi Normale
• Le client dit :
• Moyenne = 100ms
• Écart type = 20ms
• Médiane = 120ms
• Maximum = 1s
• Quel est le 99% ?
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Aucune idée.
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Quartet d'Anscombe
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Loi Normale et latence
• Le temps de réponse ne suit pas une distribution Normale.
• Dropwizard metrics :
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Loi Normale et latence
• Remplacer metrics par HdrHistogram
• Plage de valeurs
• Précision
• Empreinte mémoire constante
• http://hdrhistogram.github.io/HdrHistogram/
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Puzzles
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Puzzler #1
• Un problème ?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Puzzler #1 complet
@pingtimeout#FailAtBenchs
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Puzzler #1 - nouvel essai
• -XX:+AggressiveOpts
• Qui connaît ?
• Qu’est-ce que cela fait ?
@pingtimeout#FailAtBenchs
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Aggressive Opts ?
• Augmente le pool de Fixnum de 128 à … ?
• À vous de trouver
• Astuces
• set_aggressive_opts_flags() dans arguments.cpp
• java -XX:+PrintFlagsFinal
• C’est presque tout.
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Puzzler #2 - QCM
• Que fait ce code ?
1. Il pousse un juron2. Il ne fait pas ce qu’on pense3. Il bench Hotspot4. Il crée environ 10.000 objets
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Puzzler #2 - QCM
1. Il pousse un juron2. Il ne fait pas ce qu’on pense3. Il bench Hotspot4. Il crée environ 10.000 objets
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Puzzler #2 - solution
• Après ~10.000 itérations, le code est supprimé
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Coordinated Omission
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Java 8 Enterprisy REST API
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Runner
• Simuler de lonnnngues pause (11 secondes)
• GC
• autre tâche bloquante
• Technique: ^Z
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Récapitulatif - Timeline
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Récapitulatif avant run
• Fréquence = 1 req/s
• Durée totale = 100s
• Longue pause = 11s
• Temps de réponse nominal ≈ 10ms
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Attentes - Latence
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Attentes - centiles
• Calcul anticipé des centiles (en secondes)
• Max ∈ ]10; 11]
• 99% ∈ ]9; 10]
• 98% ∈ ]8; 9]
• 95% ∈ ]5; 6]
• 90% ∈ ]0; 1]
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Réalité
Wait… What?
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Réalité - Débit
100s
100ème requête
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Réalité - Latence
100s
100ème requête
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
CO - Définition
• Interval entre les points = i
• Latence nominale << i
• Valeurs extrêmes > x
• Requêtes suivantes retardées
• Après la période néfaste
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Qu’est-ce qui est mesuré ?
• 99% des bonnes requêtes
• ≠ 99% de toutes les requêtes
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Une erreur fréquenteI rarely see load testers that don't suffer from it, including common testers used in the industry (JMeter, Grinder, HP LoadRunner), benchmarks (YCSB, SPECeverything, etc.), and custom build testers I see used by many low latency shops. » — Gil Tene
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Tester le test
• Tester le testeur
• Remplacer le SUT par un noop
• Temps de réponse: 0
• Test ^Z
• Vérifier les hypothèses
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Correction
• Connaître le temps d’envoi de chaque requête
• Utiliser ce temps comme temps de départ
• Effet:
• Faire apparaître les requêtes retardées
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
• Connaître l’interval entre les envois
• Utiliser HdrHistogram
• Classe Histogram
• copyCorrectedForCoordinatedOmission(…)
• recordValueWithExpectedInterval(…)
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Récap
@pingtimeout#FailAtBenchs
The successful man will profit from his mistakes and try again in a different way
- Dale Carnegie
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Des résultats contextuels
http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
Sources
• https://groups.google.com/d/msg/mechanical-sympathy/
• http://latencytipoftheday.blogspot.fr/
• http://www.websiteoptimization.com/speed/tweak/average-number-web-objects/
• http://tylervigen.com/
• Hotspot source code
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Q & A
@YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs
Merci pour votre attention !