• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
OOM m'a tuer - Devoxx France 2012
 

OOM m'a tuer - Devoxx France 2012

on

  • 4,212 views

By Frank Pavageau and Renaud Bruyeron

By Frank Pavageau and Renaud Bruyeron

Statistics

Views

Total Views
4,212
Views on SlideShare
3,931
Embed Views
281

Actions

Likes
9
Downloads
74
Comments
1

5 Embeds 281

http://www.leblogdefatiha.com 247
https://twitter.com 28
http://www.linkedin.com 4
https://si0.twimg.com 1
http://feeds.feedburner.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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 OOM m'a tuer - Devoxx France 2012 Presentation Transcript

  • OOM m’a tuer Renaud Bruyeron @brew_your_own Frank Pavageau @fpavageau 1Monday, April 23, 12
  • 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
  • Renaud Bruyeron @brew_your_own CTO d’ • Débuts au • C -> Perl -> PHP -> Java 3Monday, April 23, 12
  • Renaud Bruyeron @brew_your_own CTO d’ • Débuts au • C -> Perl -> PHP -> Java 3Monday, April 23, 12
  • Frank Pavageau @fpavageau Architecte Senior • C++ -> PHP -> Java • Systèmes et devops • Tech Lead socle eCommerce 4Monday, April 23, 12
  • Frank Pavageau @fpavageau Architecte Senior • C++ -> PHP -> Java • Systèmes et devops • Tech Lead socle eCommerce 4Monday, April 23, 12
  • Une Plateforme web e-commerce B2C Apache Tomcat Oracle 5Monday, April 23, 12
  • Une Plateforme web e-commerce B2C Apache •12+ Serveurs Tomcat •10 Webapps différentes •50+ JVMs Oracle (JDK6) Oracle 5Monday, April 23, 12
  • 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
  • ... 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
  • ... 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
  • vs. Débit Latence 7Monday, April 23, 12
  • 8Monday, April 23, 12
  • Application interactive: Il faut privilégier les temps de réponse! 8Monday, April 23, 12
  • Le flagrant délit Connections JDBC Temps 9Monday, April 23, 12
  • Le flagrant délit Connections JDBC Requêtes/s Temps Temps 9Monday, April 23, 12
  • Le flagrant délit Connections JDBC Requêtes/s Temps Temps Threads actifs Temps 9Monday, April 23, 12
  • 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
  • l’explication HeapTaille en MB 1 heure 10 Monday, April 23, 12
  • l’explication Heap On manque de recul: zoom arrière!Taille en MB 1 heure 10 Monday, April 23, 12
  • l’explication HeapTaille en MB 24 heures 11 Monday, April 23, 12
  • l’explication HeapTaille en MB 24 heures 11 Monday, April 23, 12
  • l’explication HeapTaille en MB 24 heures 11 Monday, April 23, 12
  • l’explication Heap % de temps passé en GC 100 75Taille en MB 50 25 0 1 heure 1 heure 12 Monday, April 23, 12
  • The usual suspects... 13Monday, April 23, 12
  • The usual suspects... • OutOfMemory Heap 13Monday, April 23, 12
  • The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen 13Monday, April 23, 12
  • The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM 13Monday, April 23, 12
  • The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM ➡ Sous forte charge = plantage assuré 13Monday, April 23, 12
  • The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM ➡ Sous forte charge = plantage assuré 13Monday, April 23, 12
  • The usual suspects... • OutOfMemory Heap • OutOfMemory PermGen • Longues pauses de la JVM ➡ Sous forte charge = plantage assuré 13Monday, April 23, 12
  • 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
  • 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
  • OK, donc il suffit de régler quelques options... 15Monday, April 23, 12
  • 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
  • 16Monday, April 23, 12
  • 16Monday, April 23, 12
  • La mémoire dans la JVM JVM 17Monday, April 23, 12
  • Metadata de classes, Permanent (PermGen) Strings internées, etc. JVM 18Monday, April 23, 12
  • Metadata de classes, Permanent (PermGen) Strings internées, etc. Heap Les objets 19Monday, April 23, 12
  • Permanent (PermGen) Old / Tenured Young / New 20Monday, April 23, 12
  • Permanent (PermGen) Old / Tenured Eden S0 S1 21Monday, April 23, 12
  • Approche générationelle du GC r0 r1 v ivo v ivo en ur ur Ed S S Old 22Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Allocation Old 23Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Old 24Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S 100% = GC! Old 25Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Mort Référencé Old 26Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 27Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Remise à zéro... Old 28Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Allocation Old 29Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S 100% = GC ! Old 30Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Old 31Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 32Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 33Monday, April 23, 12
  • 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
  • r0 r1 v ivo v ivo en ur ur Ed S S Allocation Old 35Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S 100% = GC ! Old 36Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Copie Old 37Monday, April 23, 12
  • r0 r1 v ivo v ivo en ur ur Ed S S Promotion Old 38Monday, April 23, 12
  • Old 39Monday, April 23, 12
  • “Assez plein” =Old ! GC 40Monday, April 23, 12
  • 41Monday, April 23, 12
  • 42Monday, April 23, 12
  • Old Compaction (optionnelle) 43Monday, April 23, 12
  • 44Monday, April 23, 12
  • Garbage Collectors • Générationnels • Stop the world! • Throughput ou Concurrent 45Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Old Parallel Concurrent 46Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Par défaut Old Parallel N/A Concurrent 47Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Old Parallel Concurrent 48Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Serial Old Parallel Concurrent 48Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel Concurrent 48Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel ParallelOld Concurrent 48Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel ParallelOld Concurrent CMS 48Monday, April 23, 12
  • Combinaisons de GCs Young Serial Parallel Serial Serial Parallel Old Parallel ParallelOld Concurrent CMS Serial CMS 48Monday, April 23, 12
  • 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
  • Comparatif des GCs 50Monday, April 23, 12
  • Comparatif des GCs 50Monday, April 23, 12
  • 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
  • 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
  • Les outils: GUIs 53Monday, April 23, 12
  • Les outils: GUIs (2) • Un profiler • Pendant le dev • Pour les autopsies! 54Monday, April 23, 12
  • Les outils: GUIs (2) • Un profiler • Pendant le dev • Pour les autopsies! HeapDumpOnOutOfMemoryError HeapDumpPath 54Monday, April 23, 12
  • verbose:gc 55Monday, April 23, 12
  • verbose:gc 55Monday, April 23, 12
  • verbose:gc 55Monday, April 23, 12
  • verbose:gc 55Monday, April 23, 12
  • verbose:gc 55Monday, April 23, 12
  • verbose:gc 55Monday, April 23, 12
  • verbose:gc 55Monday, April 23, 12
  • verbose:gc Stop the world! 55Monday, April 23, 12
  • verbose:gc Stop the world! 55Monday, April 23, 12
  • MBeans 56Monday, April 23, 12
  • OK, donc on sait mesurer... la température! 57Monday, April 23, 12
  • OK, donc on sait mesurer... la température ! = 58Monday, April 23, 12
  • 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
  • Donc il faut persister les mesures ! • JMX + jmxtrans • RRD • Graphite • etc. 60Monday, April 23, 12
  • On peut modifier les réglages...Credit: http://www.our-energy.com 61Monday, April 23, 12
  • ... si on sait mesurer/isoler les effets des réglages Situation “avant” cputime Effet visible du tuning 62Monday, April 23, 12
  • Application et Résultats 63Monday, April 23, 12
  • Minimiser la fréquence et la durée des pauses de GC Young (ParNew) Old (CMS-initial-mark + CMS-remark) 64Monday, April 23, 12
  • vs. 65Monday, April 23, 12
  • JVM Tomcat vs. Application (code) 65Monday, April 23, 12
  • 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
  • Exemple : HashMap HashMap 48 Entry[16] 80 key Entry 32 value 67Monday, April 23, 12
  • Exemple : HashMap HashMap 48 Entry[16] 80 key Overhead = 160 Bytes! Entry 32 value 67Monday, April 23, 12
  • Exemple : HashMap HashMap 48 Entry[16] 80 key Overhead = 160 Bytes! Entry 32 value •SingletonMap (40 Bytes) •initialCapacity + loadFactor 67Monday, April 23, 12
  • GC Young / s Réduire les allocations... 68Monday, April 23, 12
  • Charge CPU ... impacte la CPU 69Monday, April 23, 12
  • 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
  • 3. Heap Size La JVM Time Heap Size Time 71Monday, April 23, 12
  • 3. La JVM pause > 1s ! Heap Size Time Heap Size Time 71Monday, April 23, 12
  • 3. La JVM pause > 1s ! Heap Size Time Heap Size GC très fréquents Time 71Monday, April 23, 12
  • La heap Heap 72Monday, April 23, 12
  • La heap Heap -Xms : taille au démarrage -Xmx : taille max 72Monday, April 23, 12
  • Young vs Old Old Young 73Monday, April 23, 12
  • Young vs Old Old -XX:NewSize -XX:MaxNewSize -XX:NewRatio Young 73Monday, April 23, 12
  • 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
  • Young trop petite: Old Young 74Monday, April 23, 12
  • 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
  • Young trop grande: Old Young 75Monday, April 23, 12
  • Young trop grande: Old Pauses de GC Young plus longues Young 75Monday, April 23, 12
  • 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
  • Réglage de Young Old On augmente Young progressivement en mesurant les effets! Young 76Monday, April 23, 12
  • Old: attention à la fragmentation! Old Young 77Monday, April 23, 12
  • Old: attention à la fragmentation! K6 < u22: on failed) JD Old omoti 15595) (pr ure size = fail (promotion ParNew Young 77Monday, April 23, 12
  • Old generation : évolution idéale 78Monday, April 23, 12
  • Old generation : évolution réelle 79Monday, April 23, 12
  • Old generation : évolutions comparées 80Monday, April 23, 12
  • Old generation : évolutions comparées Accélérations 80Monday, April 23, 12
  • 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
  • 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
  • Marge de manoeuvre Old Young 82Monday, April 23, 12
  • Marge de manoeuvre CMSInitiatingOccupancyFraction = 92% par défaut Old Young 82Monday, April 23, 12
  • 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
  • CMS initial-mark 83Monday, April 23, 12
  • CMS initial-mark (cumulé) 84Monday, April 23, 12
  • CMS initial-mark (cumulé) Mediane: -83% 84Monday, April 23, 12
  • CMS initial-mark (cumulé) Top 99%: -79% Mediane: -83% 84Monday, April 23, 12
  • CMS remark 85Monday, April 23, 12
  • CMS remark (cumulé) 86Monday, April 23, 12
  • CMS remark (cumulé) Top 90%: -56% 86Monday, April 23, 12
  • 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
  • Comparatif complet des GC 88Monday, April 23, 12
  • 89Monday, April 23, 12
  • 89Monday, April 23, 12
  • 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
  • Questions ? 91Monday, April 23, 12