How to fail at benchmarking?

6 982 vues

Publié le

A talk where we learn various ways to fail at benchmarking. First, important metrics are defined. Then, the Coordinated Omission issue is explained. Finally, Java Microbenchmark Harness (JMH) is explained through code samples.

Publié dans : Ingénierie
0 commentaire
5 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
6 982
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3 632
Actions
Partages
0
Téléchargements
69
Commentaires
0
J’aime
5
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

How to fail at benchmarking?

  1. 1. @pingtimeout#FailAtBenchs Comment rater ses benchmarks ? Pierre Laporte Ingénieur performances - Datastax @pingtimeout pierre.laporte@datastax.com
  2. 2. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Agenda • Intro • Pourquoi cette session ? • Comment se planter ? • Que mesurer ? • Comment mesurer ? • « Coordinated Omission » ? • Quel état d’esprit ?
  3. 3. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Intro
  4. 4. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs
  5. 5. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Cassandra • NoSQL • Scalabilité linéaire • Toujours disponible
  6. 6. 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)
  7. 7. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Pourquoi ce talk ?
  8. 8. @pingtimeout#FailAtBenchs I have not failed, I have just found 10,000 ways that won't work. - Thomas Edison
  9. 9. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Progresser Faire des erreurs Trouver des solutions Ne pas blâmer
  10. 10. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Benchmarks
  11. 11. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Comment se planter ?
  12. 12. 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
  13. 13. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Un problème ?
  14. 14. 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, …) • …
  15. 15. 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
  16. 16. 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, …)
  17. 17. 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 ?
  18. 18. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs • « Sur un portable de dev » Environnement
  19. 19. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs • « Sur une seule machine » Environnement
  20. 20. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Métriques • « Moyenne des résultats »
  21. 21. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Projection de capacité • Utilisation CPU ≈ 50% • Capacité restante ≈ … ?
  22. 22. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Que mesurer ?
  23. 23. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Moyenne • Supprimer les points gênants • « Moyenne de deux nombres » = … ? • Pourquoi l’utilise-t-on ? • Est-ce suffisant ?
  24. 24. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Métriques utiles • Histogramme • Centiles • 90ème • 95ème • 99ème • … • Maximum
  25. 25. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Combien de 9 ? • 99% ? • 99,99% ?? • Ça dépend. • Pour 500 utilisateurs • 99% signifie… ?
  26. 26. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Combien de 9 ? • Si 1.000.000 utilisateurs • 99% signifie… ? • 10.000 utilisateurs.
  27. 27. 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 ?
  28. 28. 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 ?
  29. 29. 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 ? »
  30. 30. 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
  31. 31. 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 ? »
  32. 32. 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 ? »
  33. 33. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Épilogue d’un benchmark • Réponse obtenue • Satisfaisante… ou pas. • Résultats Contextuels • Environnement • Charge • Contraintes • Compromis
  34. 34. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Vérités statistiques
  35. 35. 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%
  36. 36. 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% ?
  37. 37. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Aucune idée.
  38. 38. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Quartet d'Anscombe
  39. 39. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Loi Normale et latence • Le temps de réponse ne suit pas une distribution Normale. • Dropwizard metrics :
  40. 40. 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/
  41. 41. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Représentation
  42. 42. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Puzzles
  43. 43. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Puzzler #1 • Un problème ?
  44. 44. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Puzzler #1 complet
  45. 45. @pingtimeout#FailAtBenchs
  46. 46. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Puzzler #1 - nouvel essai • -XX:+AggressiveOpts • Qui connaît ? • Qu’est-ce que cela fait ?
  47. 47. @pingtimeout#FailAtBenchs
  48. 48. 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.
  49. 49. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Puzzler #2 - QCM • Que fait ce code ? 1. Il pousse un juron 2. Il ne fait pas ce qu’on pense 3. Il bench Hotspot 4. Il crée environ 10.000 objets
  50. 50. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Puzzler #2 - QCM 1. Il pousse un juron 2. Il ne fait pas ce qu’on pense 3. Il bench Hotspot 4. Il crée environ 10.000 objets
  51. 51. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Puzzler #2 - solution • Après ~10.000 itérations, le code est supprimé
  52. 52. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Coordinated Omission
  53. 53. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Java 8 Enterprisy REST API
  54. 54. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs CO client
  55. 55. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Runner • Simuler de lonnnngues pause (11 secondes) • GC • autre tâche bloquante • Technique: ^Z
  56. 56. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Récapitulatif - Timeline
  57. 57. 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
  58. 58. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Attentes - Débit
  59. 59. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Attentes - Latence
  60. 60. 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]
  61. 61. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Réalité Wait… What?
  62. 62. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Réalité
  63. 63. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Pourquoi ?
  64. 64. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Réalité - Débit 100s 100ème requête
  65. 65. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Réalité - Latence 100s 100ème requête
  66. 66. 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
  67. 67. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Qu’est-ce qui est mesuré ? • 99% des bonnes requêtes • ≠ 99% de toutes les requêtes
  68. 68. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Une erreur fréquente I 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
  69. 69. 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
  70. 70. 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
  71. 71. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs • Connaître l’interval entre les envois • Utiliser HdrHistogram • Classe Histogram • copyCorrectedForCoordinatedOmission(…) • recordValueWithExpectedInterval(…)
  72. 72. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Récap
  73. 73. @pingtimeout#FailAtBenchs The successful man will profit from his mistakes and try again in a different way - Dale Carnegie
  74. 74. http://tiny.cc/FailAtBenchs @pingtimeout#FailAtBenchs Des résultats contextuels
  75. 75. 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
  76. 76. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Q & A
  77. 77. @YourTwitterHandle@YourTwitterHandle@pingtimeout#FailAtBenchs Merci pour votre attention !

×