Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

JVM tuning: Lo que debes saber antes de subir a producción

Slides de la charla dada en el Barcelona JUG el 27/02/2020

  • Identifiez-vous pour voir les commentaires

JVM tuning: Lo que debes saber antes de subir a producción

  1. 1. JVM Tuning Lo que debes saber antes de subir a producción @edusanchezcon
  2. 2. Sobre mí Eduardo Sánchez @edusanchezcon github.com/EduSanchezCon Consultor tecnológico en NOT AN EXPERT
  3. 3. Qué vamos a ver * Tests de carga * Tuning de memoria * Tuning de rendimiento
  4. 4. Suda en desarrollo para no sangrar en producción
  5. 5. @edusanchezcon Tests de carga Hay que probar un uso similar a la que tendrá en producción Carga proporcional Funcionalidad coherente Entorno parecido
  6. 6. @edusanchezcon Tests de carga: Medir y Monitorizar Medir para saber cuánto Tiempo de respuesta Operaciones / Tiempo Tiempo total por lote Monitorizar para saber por qué Sistema: CPU, Memoria, Disco JVM: Memoria (Heap), GCs Logs, Sampling, Profilers
  7. 7. @edusanchezcon Load Test Uso similar al de producción Tests de carga: Tipos
  8. 8. @edusanchezcon Capacity Test Degradación en función de la carga Tests de carga: Tipos
  9. 9. @edusanchezcon Stress Test Comportamiento ante una carga por encima de sus capacidades Tests de carga: Tipos
  10. 10. @edusanchezcon Recovery Test Recuperación tras un desastre (fallo de BD, llenado de disco…) Tests de carga: Tipos
  11. 11. @edusanchezcon Soak Test Degradación en función del tiempo Tests de carga: Tipos
  12. 12. @edusanchezcon JMeter, LoadUI, WebLoad, Gatling JVisualVM, JConsole, Java Mission Control, Java Flight Recorder Tests de carga: Herramientas Y mucho más: Grafana, JMX events, integración en CI…
  13. 13. Qué vamos a ver * Tests de carga * Performance Tuning * Memory Tuning
  14. 14. JVM Unboxing
  15. 15. @edusanchezcon Process Memory La memoria en la JVM
  16. 16. @edusanchezcon Heap Metaspace Code Cache Thread N Thread 2 Thread 1 La memoria en la JVM -Xms -Xmx
  17. 17. @edusanchezcon Young Generation Metaspace Code Cache Old Generation Eden survivor 1 2 compressed class space PC Register JVM Stack Native Stack Thread N La memoria en la JVM
  18. 18. @edusanchezcon La memoria en la JVM (JDK ≤ 7) Young Generation Thread N Old Generation Eden survivor 1 2 PC Register JVM Stack Native Stack PermGen Code Cache
  19. 19. @edusanchezcon ¿Cómo se gestiona la Memoria? No se libera memoria explícitamente El Garbage Collector libera lo que ya no se usa
  20. 20. @edusanchezcon C B D E N A J H I F G M K L Q P ¿Cómo se detecta lo que ya no se usa?
  21. 21. @edusanchezcon C B D E N A J H I F G M K L Q P ¿Cómo se detecta lo que ya no se usa?
  22. 22. @edusanchezcon C B D E N A J H I F G M K L Q P static Thread ¿Cómo se detecta lo que ya no se usa?
  23. 23. @edusanchezcon C B D E N A J H I F G M K L Q P GC Roots Reachable Objects Non Reachable Objects ¿Cómo se detecta lo que ya no se usa?
  24. 24. @edusanchezcon C B D E A J H I F G KP GC Roots Reachable Objects ¿Cómo se detecta lo que ya no se usa?
  25. 25. Hipótesis generacional Objetos, peces, la mayoría mueren jovenes
  26. 26. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  27. 27. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  28. 28. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  29. 29. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  30. 30. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  31. 31. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  32. 32. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  33. 33. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  34. 34. @edusanchezcon Old GenerationEden Survivors 1 2 Generational Collection
  35. 35. @edusanchezcon Epsilon GC Garbage Collectors G1 GC Concurrent Mark & Sweep Z GC Shenandoah Stop The World Concurrent Serial GC Parallel GC Regionalized
  36. 36. @edusanchezcon G1GC E E T T T T T T E T T E T T T T T T S2 T T T T T T T S1 T S2 H T T S1 T T T H T T HH H
  37. 37. @edusanchezcon Heap: Problemas comunes OutOfMemoryError: Java heap space|GC overhead limit exceeded Dimensionamiento incorrecto de la memoria Memory leak No Referenced Referenced Not Used Used { leak
  38. 38. @edusanchezcon Heap: Diagnóstico Heap Dumps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path-to-hd jcmd <pid> GC.heap_dump <path> JVisualVM, JConsole, Java Mission Control Sin Full GC previo: jcmd <pid> GC.heap_dump -all <path> Análisis: Eclipse Memory Analyzer Tool
  39. 39. Ahí te hemos dejado el dump
  40. 40. @edusanchezcon Monitorización continua del tamaño del Heap Configuración de frameworks/librerías de terceros Heap: Recomendaciones -Xms = -Xmx
  41. 41. @edusanchezcon -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path> Java 9+ -xlog Garbage Collector: GC Logs SIEMPRE ACTIVADO EN PRODUCCIÓN
  42. 42. @edusanchezcon Garbage Collector: GC Logs 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
  43. 43. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Timestamp absoluto del gc Garbage Collector: GC Logs
  44. 44. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Timestamp relativo al inicio de la JVM Garbage Collector: GC Logs
  45. 45. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Causa del GC Garbage Collector: GC Logs
  46. 46. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Región de memoria Garbage Collector: GC Logs
  47. 47. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Espacio antes y después del GC (capacidad de la región de memoria) Garbage Collector: GC Logs
  48. 48. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Espacio antes y después dell GC (capacidad total del Heap) Garbage Collector: GC Logs
  49. 49. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Tiempo real Garbage Collector: GC Logs
  50. 50. @edusanchezcon 2018-11-19T10:49:38.496-0100: 17.830: [Full GC (Ergonomics) [PSYoungGen: 256K->0K(43008K)] [ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K), [Metaspace: 5450K->5442K(1056768K)], 0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Tiempo de CPU Garbage Collector: GC Logs
  51. 51. Qué vamos a ver * Tests de carga * Memory Tuning * Performance Tuning
  52. 52. “Premature optimization is the root of all evil” Donald Knuth
  53. 53. @edusanchezcon Nuestro código vs lo que se ejecuta Interprete Bytecode Compilador Código máquina optimizado
  54. 54. @edusanchezcon Nuestro código vs lo que se ejecuta Interprete Bytecode C1 Código máquina C2 Código máquina optimizado
  55. 55. @edusanchezcon Optimizaciones del JIT Compiler ‣ Trivial inlining ‣ Call graph inlining ‣ Tail recursion elimination ‣ Virtual call guard optimizations ‣ Local data flow analyses and optimizations ‣ Register usage optimization ‣ Simplifications of Java idioms ‣ Code reordering, splitting, and removal ‣ Loop reduction and inversion ‣ Loop striding and loop-invariant code motion ‣ Loop unrolling and peeling ‣ Loop versioning and specialization ‣ Exception-directed optimization ‣ Switch analysis ‣ Global data flow analyses and optimizations ‣ Partial redundancy elimination ‣ Escape analysis ‣ GC and memory allocation optimizations ‣ Synchronization optimizations
  56. 56. @edusanchezcon Ciclo de performance tuning Determinar la carga máxima Localizar el cuello de botella Solucionar el problema Load Test Sampler/Profiler
  57. 57. @edusanchezcon Ejemplo práctico -XX:+UnlockCommercialFeatures -XX:FlightRecorder
  58. 58. @edusanchezcon Operaciones de Entrada / Salida Cuellos de botella frecuentes Ejecutar muchas veces lo mismo (de manera innecesaria) Dimensionamiento ineficiente de pools de hilos
  59. 59. Wanna go faster? No GCs Native Memory Specialized Collections CharSequence
  60. 60. ? @edusanchezcon

×