OOM m'a tuer - Devoxx France 2012

7,794 views
7,670 views

Published on

By Frank Pavageau and Renaud Bruyeron

Published in: Technology
1 Comment
9 Likes
Statistics
Notes
No Downloads
Views
Total views
7,794
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
77
Comments
1
Likes
9
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • pause sondage\n
  • pause sondage\n
  • pause sondage\n
  • pause sondage\n
  • pause sondage\n
  • pause sondage\n
  • pause sondage\n
  • pause sondage\n
  • pause sondage\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • générations\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • analogie avec le toubib\n
  • sismographe?\n
  • sondage\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • OOM m'a tuer - Devoxx France 2012

    1. 1. OOM m’a tuer Renaud Bruyeron @brew_your_own Frank Pavageau @fpavageau 1Monday, April 23, 12
    2. 2. Agenda 1. La scène du crime 2. La gestion de la mémoire dans la JVM: les bases, les outils 3. Application 2Monday, April 23, 12
    3. 3. Renaud Bruyeron @brew_your_own CTO d’ • Débuts au • C -> Perl -> PHP -> Java 3Monday, April 23, 12
    4. 4. Renaud Bruyeron @brew_your_own CTO d’ • Débuts au • C -> Perl -> PHP -> Java 3Monday, April 23, 12
    5. 5. Frank Pavageau @fpavageau Architecte Senior • C++ -> PHP -> Java • Systèmes et devops • Tech Lead socle eCommerce 4Monday, April 23, 12
    6. 6. Frank Pavageau @fpavageau Architecte Senior • C++ -> PHP -> Java • Systèmes et devops • Tech Lead socle eCommerce 4Monday, April 23, 12
    7. 7. Une Plateforme web e-commerce B2C Apache Tomcat Oracle 5Monday, April 23, 12
    8. 8. Une Plateforme web e-commerce B2C Apache •12+ Serveurs Tomcat •10 Webapps différentes •50+ JVMs Oracle (JDK6) Oracle 5Monday, April 23, 12
    9. 9. Une Plateforme web e-commerce B2C Apache •12+ Serveurs Tomcat •10 Webapps différentes •50+ JVMs Oracle (JDK6) •> 30000 sessions •250-400 Req/s Oracle •Variance très importante du trafic 5Monday, April 23, 12
    10. 10. ... une victime un peu atypique... Modélisation du catalogue sous forme de Graphe Implémentation custom du moteur de catalogue 100% sur la Heap (pas de BDD) Mise à jour par AtomicReference.set() 6Monday, April 23, 12
    11. 11. ... une victime un peu atypique... Modélisation du catalogue sous forme de Graphe Implémentation custom du moteur de catalogue 100% sur la Heap (pas de BDD) Mise à jour par AtomicReference.set() Impossible de “cacher” aggressivement Beaucoup d’objets créés à chaque Request Raccordements SI = latence = concurrence élevée 6Monday, April 23, 12
    12. 12. vs. Débit Latence 7Monday, April 23, 12
    13. 13. 8Monday, April 23, 12
    14. 14. Application interactive: Il faut privilégier les temps de réponse! 8Monday, April 23, 12
    15. 15. Le flagrant délit Connections JDBC Temps 9Monday, April 23, 12
    16. 16. Le flagrant délit Connections JDBC Requêtes/s Temps Temps 9Monday, April 23, 12
    17. 17. Le flagrant délit Connections JDBC Requêtes/s Temps Temps Threads actifs Temps 9Monday, April 23, 12
    18. 18. Le flagrant délit Connections JDBC Requêtes/s Temps Temps Threads actifs Requêtes en attente (Executor Queue Size) Temps Temps 9Monday, April 23, 12
    19. 19. l’explication HeapTaille en MB 1 heure 10 Monday, April 23, 12
    20. 20. l’explication Heap On manque de recul: zoom arrière!Taille en MB 1 heure 10 Monday, April 23, 12
    21. 21. l’explication HeapTaille en MB 24 heures 11 Monday, April 23, 12
    22. 22. l’explication HeapTaille en MB 24 heures 11 Monday, April 23, 12
    23. 23. l’explication HeapTaille en MB 24 heures 11 Monday, April 23, 12
    24. 24. l’explication Heap % de temps passé en GC 100 75Taille en MB 50 25 0 1 heure 1 heure 12 Monday, April 23, 12
    25. 25. The usual suspects... 13Monday, April 23, 12
    26. 26. The usual suspects... • OutOfMemory Heap 13Monday, April 23, 12
    27. 27. The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen 13Monday, April 23, 12
    28. 28. The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM 13Monday, April 23, 12
    29. 29. The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM ➡ Sous forte charge = plantage assuré 13Monday, April 23, 12
    30. 30. The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM ➡ Sous forte charge = plantage assuré 13Monday, April 23, 12
    31. 31. The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM ➡ Sous forte charge = plantage assuré 13Monday, April 23, 12
    32. 32. G C m ’a The usual suspects... • • e r!! l e OutOfMemory Heap OutOfMemory PermGen •Monday, April 23, 12 t u Longues pauses de la JVM ➡ Sous forte charge = plantage assuré 13
    33. 33. Mais ça sert à quoi alors le GC? “Many concurrent algorithms are very easy to write with a GC and totally hard (to down right impossible) using explicit free.” Cliff Click 14Monday, April 23, 12
    34. 34. OK, donc il suffit de régler quelques options... 15Monday, April 23, 12
    35. 35. OK, donc il suffit de régler quelques options... 664 options....Source: Oracle JVM 1.6.0_31 x86_64 server 15Monday, April 23, 12
    36. 36. 16Monday, April 23, 12
    37. 37. 16Monday, April 23, 12
    38. 38. La mémoire dans la JVM JVM 17Monday, April 23, 12
    39. 39. Metadata de classes, Permanent (PermGen) Strings internées, etc. JVM 18Monday, April 23, 12
    40. 40. Metadata de classes, Permanent (PermGen) Strings internées, etc. Heap Les objets 19Monday, April 23, 12
    41. 41. Permanent (PermGen) Old / Tenured Young / New 20Monday, April 23, 12
    42. 42. Permanent (PermGen) Old / Tenured Eden S0 S1 21Monday, April 23, 12
    43. 43. Approche générationelle du GC r0 r1 v ivo v ivo en ur ur Ed S S Old 22Monday, April 23, 12
    44. 44. r0 r1 v ivo v ivo en ur ur Ed S S Allocation Old 23Monday, April 23, 12
    45. 45. r0 r1 v ivo v ivo en ur ur Ed S S Old 24Monday, April 23, 12
    46. 46. r0 r1 v ivo v ivo en ur ur Ed S S 100% = GC! Old 25Monday, April 23, 12
    47. 47. r0 r1 v ivo v ivo en ur ur Ed S S Mort Référencé Old 26Monday, April 23, 12
    48. 48. r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 27Monday, April 23, 12
    49. 49. r0 r1 v ivo v ivo en ur ur Ed S S Remise à zéro... Old 28Monday, April 23, 12
    50. 50. r0 r1 v ivo v ivo en ur ur Ed S S Allocation Old 29Monday, April 23, 12
    51. 51. r0 r1 v ivo v ivo en ur ur Ed S S 100% = GC ! Old 30Monday, April 23, 12
    52. 52. r0 r1 v ivo v ivo en ur ur Ed S S Old 31Monday, April 23, 12
    53. 53. r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 32Monday, April 23, 12
    54. 54. r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 33Monday, April 23, 12
    55. 55. r0 r1 v ivo v ivo en ur ur Ed S S Remise à zéro Génération 1 Génération 2 Old 34Monday, April 23, 12
    56. 56. r0 r1 v ivo v ivo en ur ur Ed S S Allocation Old 35Monday, April 23, 12
    57. 57. r0 r1 v ivo v ivo en ur ur Ed S S 100% = GC ! Old 36Monday, April 23, 12
    58. 58. r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 37Monday, April 23, 12
    59. 59. r0 r1 v ivo v ivo en ur ur Ed S S Promotion Old 38Monday, April 23, 12
    60. 60. Old 39Monday, April 23, 12
    61. 61. “Assez plein” =Old ! GC 40Monday, April 23, 12
    62. 62. 41Monday, April 23, 12
    63. 63. 42Monday, April 23, 12
    64. 64. Old Compaction (optionnelle) 43Monday, April 23, 12
    65. 65. 44Monday, April 23, 12
    66. 66. Garbage Collectors • Générationnels • Stop the world! • Throughput ou Concurrent 45Monday, April 23, 12
    67. 67. Combinaisons de GCs Young Serial Parallel Serial Old Parallel Concurrent 46Monday, April 23, 12
    68. 68. Combinaisons de GCs Young Serial Parallel Serial Par défaut Old Parallel N/A Concurrent 47Monday, April 23, 12
    69. 69. Combinaisons de GCs Young Serial Parallel Serial Old Parallel Concurrent 48Monday, April 23, 12
    70. 70. Combinaisons de GCs Young Serial Parallel Serial Serial Old Parallel Concurrent 48Monday, April 23, 12
    71. 71. Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel Concurrent 48Monday, April 23, 12
    72. 72. Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel ParallelOld Concurrent 48Monday, April 23, 12
    73. 73. Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel ParallelOld Concurrent CMS 48Monday, April 23, 12
    74. 74. Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel ParallelOld Concurrent CMS Serial CMS 48Monday, April 23, 12
    75. 75. Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel ParallelOld Concurrent CMS Serial CMS Les implémentations de Parallel diffèrent suivant les combinaisons 49Monday, April 23, 12
    76. 76. Comparatif des GCs 50Monday, April 23, 12
    77. 77. Comparatif des GCs 50Monday, April 23, 12
    78. 78. CMS est le bon compromis Serial 917 Parallel 852 ParallelOld 846 CMS 871 CMS Serial 937 0 250 500 750 1000 Durée moyenne du test (s) 51Monday, April 23, 12
    79. 79. Les outils: CLI jps, jhat, jmap, jstack, jstat $ jstat -gcutil PID S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 40.88 58.41 18.34 66.65 2729 316.538 46 6.820 323.358 52Monday, April 23, 12
    80. 80. Les outils: GUIs 53Monday, April 23, 12
    81. 81. Les outils: GUIs (2) • Un profiler • Pendant le dev • Pour les autopsies! 54Monday, April 23, 12
    82. 82. Les outils: GUIs (2) • Un profiler • Pendant le dev • Pour les autopsies! HeapDumpOnOutOfMemoryError HeapDumpPath 54Monday, April 23, 12
    83. 83. verbose:gc 55Monday, April 23, 12
    84. 84. verbose:gc 55Monday, April 23, 12
    85. 85. verbose:gc 55Monday, April 23, 12
    86. 86. verbose:gc 55Monday, April 23, 12
    87. 87. verbose:gc 55Monday, April 23, 12
    88. 88. verbose:gc 55Monday, April 23, 12
    89. 89. verbose:gc 55Monday, April 23, 12
    90. 90. verbose:gc Stop the world! 55Monday, April 23, 12
    91. 91. verbose:gc Stop the world! 55Monday, April 23, 12
    92. 92. MBeans 56Monday, April 23, 12
    93. 93. OK, donc on sait mesurer... la température! 57Monday, April 23, 12
    94. 94. OK, donc on sait mesurer... la température ! = 58Monday, April 23, 12
    95. 95. Problème : on ne peut pas faire un diagnostic avec une simple mesure... Il faut historiser pour constituer un référentiel !Credit: http://www.lhup.edu/mkhalequ/fieldtrip/geos253.htm 59Monday, April 23, 12
    96. 96. Donc il faut persister les mesures ! • JMX + jmxtrans • RRD • Graphite • etc. 60Monday, April 23, 12
    97. 97. On peut modifier les réglages...Credit: http://www.our-energy.com 61Monday, April 23, 12
    98. 98. ... si on sait mesurer/isoler les effets des réglages Situation “avant” cputime Effet visible du tuning 62Monday, April 23, 12
    99. 99. Application et Résultats 63Monday, April 23, 12
    100. 100. Minimiser la fréquence et la durée des pauses de GC Young (ParNew) Old (CMS-initial-mark + CMS-remark) 64Monday, April 23, 12
    101. 101. vs. 65Monday, April 23, 12
    102. 102. JVM Tomcat vs. Application (code) 65Monday, April 23, 12
    103. 103. 1. Le code • Le tuning de JVM ne peut pas compenser du code de mauvaise qualité • Des règles peuvent aider • Privilégier les données immutables et donc réutilisables sans risque • Sortir les invariants, notamment les instanciations, et surtout dans les boucles • Connaitre les caractéristiques des structures de données des frameworks (java.util, Guava, Hibernate, etc.) • Attention au rapport poids de la structure / poids des données 66Monday, April 23, 12
    104. 104. Exemple : HashMap HashMap 48 Entry[16] 80 key Entry 32 value 67Monday, April 23, 12
    105. 105. Exemple : HashMap HashMap 48 Entry[16] 80 key Overhead = 160 Bytes! Entry 32 value 67Monday, April 23, 12
    106. 106. Exemple : HashMap HashMap 48 Entry[16] 80 key Overhead = 160 Bytes! Entry 32 value •SingletonMap (40 Bytes) •initialCapacity + loadFactor 67Monday, April 23, 12
    107. 107. GC Young / s Réduire les allocations... 68Monday, April 23, 12
    108. 108. Charge CPU ... impacte la CPU 69Monday, April 23, 12
    109. 109. 2. Tomcat • Se méfier du pooling • Les tags: enablePooling dans web/webdefault.xml • -Dorg.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false • Attention aux buffers et à leur réutilisation • -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true • Le nombre de JSP impacte les besoins en PermGen • Faire des tests et mesurer les impacts! 70Monday, April 23, 12
    110. 110. 3. Heap Size La JVM Time Heap Size Time 71Monday, April 23, 12
    111. 111. 3. La JVM pause > 1s ! Heap Size Time Heap Size Time 71Monday, April 23, 12
    112. 112. 3. La JVM pause > 1s ! Heap Size Time Heap Size GC très fréquents Time 71Monday, April 23, 12
    113. 113. La heap Heap 72Monday, April 23, 12
    114. 114. La heap Heap -Xms : taille au démarrage -Xmx : taille max 72Monday, April 23, 12
    115. 115. Young vs Old Old Young 73Monday, April 23, 12
    116. 116. Young vs Old Old -XX:NewSize -XX:MaxNewSize -XX:NewRatio Young 73Monday, April 23, 12
    117. 117. Young vs Old •“Working Set” Old •Caches, Pools d’objets •HttpSession, objets de durée de vie intermédiaire Young Objets < RequestScope 73Monday, April 23, 12
    118. 118. Young trop petite: Old Young 74Monday, April 23, 12
    119. 119. Young trop petite: Old Young se remplit très vite = Beaucoup de GC Young Promotion excessive d’objets en Old = Young Beaucoup de GC Old 74Monday, April 23, 12
    120. 120. Young trop grande: Old Young 75Monday, April 23, 12
    121. 121. Young trop grande: Old Pauses de GC Young plus longues Young 75Monday, April 23, 12
    122. 122. Réglage de Young Old NewRatio=8 pour -server sur Intel = Trop peu de Young pour une webapp Young avec de la charge! 76Monday, April 23, 12
    123. 123. Réglage de Young Old On augmente Young progressivement en mesurant les effets! Young 76Monday, April 23, 12
    124. 124. Old: attention à la fragmentation! Old Young 77Monday, April 23, 12
    125. 125. Old: attention à la fragmentation! K6 < u22: on failed) JD Old omoti 15595) (pr ure size = fail (promotion ParNew Young 77Monday, April 23, 12
    126. 126. Old generation : évolution idéale 78Monday, April 23, 12
    127. 127. Old generation : évolution réelle 79Monday, April 23, 12
    128. 128. Old generation : évolutions comparées 80Monday, April 23, 12
    129. 129. Old generation : évolutions comparées Accélérations 80Monday, April 23, 12
    130. 130. Contraintes supplémentaires • Prise en compte des variations irrégulières • Augmentation de trafic => augmentation de la pression mémoire • Pour bien fonctionner, CMS doit avoir de la marge • Plusieurs phases successives, la plupart concurrentes avec l’application => le remplissage continue en même temps 81Monday, April 23, 12
    131. 131. Contraintes supplémentaires • Prise en compte des variations irrégulières • Augmentation de trafic => augmentation de la pression mémoire • Pour bien fonctionner, CMS doit avoir de la marge • Plusieurs phases successives, la plupart concurrentes avec l’application => le remplissage continue en même temps (concurrent mode failure): 2165740K->1284261K(2228224K), 8.9411250 secs 81Monday, April 23, 12
    132. 132. Marge de manoeuvre Old Young 82Monday, April 23, 12
    133. 133. Marge de manoeuvre CMSInitiatingOccupancyFraction = 92% par défaut Old Young 82Monday, April 23, 12
    134. 134. Marge de manoeuvre 75-80% pour plus de marge UseCMSInitiatingOccupancyOnly pour forcer le déclenchement uniquement sur ce critère! Old Young 82Monday, April 23, 12
    135. 135. CMS initial-mark 83Monday, April 23, 12
    136. 136. CMS initial-mark (cumulé) 84Monday, April 23, 12
    137. 137. CMS initial-mark (cumulé) Mediane: -83% 84Monday, April 23, 12
    138. 138. CMS initial-mark (cumulé) Top 99%: -79% Mediane: -83% 84Monday, April 23, 12
    139. 139. CMS remark 85Monday, April 23, 12
    140. 140. CMS remark (cumulé) 86Monday, April 23, 12
    141. 141. CMS remark (cumulé) Top 90%: -56% 86Monday, April 23, 12
    142. 142. Il reste des pauses ! • RMI (donc JMX) provoque des GC explicites à intervalles réguliers • Appels à System.gc() • GC explicite = Full GC (Serial) = pause de 4s ! • DisableExplicitGC + CMSClassUnloadingEnabled • ExplicitGCInvokesConcurrentAndUnloadsClasses 87Monday, April 23, 12
    143. 143. Comparatif complet des GC 88Monday, April 23, 12
    144. 144. 89Monday, April 23, 12
    145. 145. 89Monday, April 23, 12
    146. 146. Et après? • Tuning des Survivors • Taille, ratio de survivants, age maximum • G1 • Principes et options complétement différents • Autres JDKs : JRockit, Azul, IBM • Vérifier les réglages à chaque changement applicatif • Mesurer, mesurer, mesurer! 90Monday, April 23, 12
    147. 147. Questions ? 91Monday, April 23, 12

    ×