47
Hvordan enkel analyse kan øke stabiliteten og hastigheten din server VM! Javazone 2010 Henning Spjelkavik

Jz2010 Hvordan enkel analyse kan øke stabiliteten og hastigheten

Embed Size (px)

Citation preview

Hvordan enkel analyse kan øke

stabiliteten og hastigheten på din server VM!

Javazone 2010 Henning Spjelkavik

Demo

Mål

• Grunnleggende kunnskap om heap og tråder

• Ferdigheter til å ta en enkel analyse

• Gjenkjenne noen vanlige problemer

Agenda

• Demo • Hva er garbage collection? Har vi det? Trenger vi

det? • Hvordan analysere demo?

– Først med kommandolinjeverktøy – Deretter med VisualVM – Yourkit

• Hva har skjedd - vi ser på kode • Analyse av minne- og trådlekkasje • Demonstrasjon av ulike case

Søker etter flytopplevelser!

Henning Spjelkavik

Demo – hva skjedde?

• Drift. Hva gjør vi nå? Restart?

• Første bud:

• Se i loggen!

Hvordan bli god!

• «Outliers»

• Som med leger: bør ha sett det før

• Hvordan få erfaring

– Oppsøke læring

– Ved å feile ofte, og lære av det

– Lære av andre

• Lære noe annet

• Nysgjerrig – drivkraft for å forstå hva som skjer

Konklusjon

• Ved unormal oppførsel...

• ...må vi ta vare på tilstrekkelig med info – Jstack, over tid

– Jmap

– Applikasjonslogger

– Netstat, vmstat

– Munin / Melody

• Descartes++: Scientific method

• Sakichi Toyoda: 5 Whys!

Søppeltømming

Referansetelling

Kompromiss – tid og rom

Synkron, stop the world

Generasjonsbasert

Parallell

Størrelse

http://www.flickr.com/photos/peterkaminski/17964466/sizes/m/in/photostream/

Heap i en moderne JVM

• Forutsetning: De fleste objekter er kortlivet

• «weak generational hypothesis»

• Web app

• Ulike rom

– Young (Eden, S0, S1)

– Tenured/old

– Permanent

Visualisering

• Jstat –gc

• VisualVM med VisualGC

jstat –gc S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT

68 224 68 224 0 68 224 273 152 127 522 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 128 550 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 129 891 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 136 394 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 137 400 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 138 741 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 139 747 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 141 173 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 146 470 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 147 963 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

68 224 68 224 0 68 224 273 152 191 471 1 945 600 1 094 537 475 648 279 260 2 101 48 748 73 205.794 693.142

S0C – Survivor 0 Capacity – Total kapasitet S0U – Survivor 0 Usage – Hvor mye er i bruk EC/EU – Eden OC/OU – Old PC/PU – Permanent YGC – Antall Young Garbage Collections; YGCT – tid brukt i sekunder FGC – Full Garbage Collections; FGCT – tid bruk t i sekunder GCT – Total tid brukt på GC

Ulike justeringer

• Maksimal størrelse på heap: • -Xmx2300M

• -Xms2300M

• -XX:MaxPermSize=500M

• NewSize og Survivor ratio

Analyse av kræsj

• Caused by: – java.lang.OutOfMemoryError: Java heap space

– java.lang.OutOfMemoryError: PermGen space

• Skru på: -verbose:gc

• jmap

• Skru på: -XX:+HeapDumpOnOutOfMemoryError

• VisualVM (/ NetBeans Profiler)

• Analyse av hprof (jhat)

• YourKit-analyse av hprof

Caused by: java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:2882)

at java.lang.AbstractStringBuilder.expandCapacity

at java.lang.AbstractStringBuilder.append

at java.lang.StringBuilder.append

at sun.misc.FloatingDecimal.appendTo

at java.lang.AbstractStringBuilder.append

at java.lang.StringBuilder.append

at net.spjelkavik.jz2010.HugeObject.<init>

at net.spjelkavik.jz2010.RiceCookerDao.getAll

at net.spjelkavik.jz2010.RiceCookerDao.findByPk

La oss undersøke... VisualVM YourKit

Andre eksempler - Lekkasje

Lekkasje

1.2 GB er referert fra ResultImpl... Lekkasje av resultatsett?

Hvor i koden objekter er allokert?

Hvordan finne unødvendig objektallokering?

Tråder

• Hva er tråder?

• Hvordan ser vi dem?

– Jstack

– Jstack + shell

– Tda

http://www.flickr.com/photos/24557420@N05/4014146016/sizes/m/in/photostream/

Tråder – hva går galt

• Ulike tilstander

– WAITING, TIMED_WAIT

– RUNNABLE

– BLOCKED

• Mange som er BLOCKED, WAIT

• Mange som er RUNNABLE

• Vent noen minutter

Tråder – lekkasje fra indre klasser

Verktøy

• Jps

• Jmap -histo

• Jstack

jstack `pidof java`|grep -A 3

"State: RUNNABLE" | grep -B 1

'\-\-' | grep -v '\-\-' |sort

Sun JVM – Nyttige innstillinger

• -verbose:gc • -Xloggc:filename • -XX:NewRatio=2 • -XX:NewSize=400M • -Xmx2300M • -Xms2300M • -Xss256k • -XX:MaxPermSize=500M • -XX:+HeapDumpOnOutOfMemoryError • -XX:SurvivorRatio=4 • -XX:+PrintGCTimeStamps • -XX:+PrintGCDetails • -XX:+PrintTenuringDistribution • -Dcom.sun.management.jmxremote

: 331107K->49808K(341376K), 0.2074020 secs] 1545038K->1279509K(2286976K), 0.2077580 secs] [Times: user=1.47 sys=0.04,

real=0.21 secs]

30907.016: [GC 30907.016: [ParNew

Desired survivor size 34930688 bytes, new threshold 2 (max 15)

- age 1: 29166992 bytes, 29166992 total

- age 2: 18755920 bytes, 47922912 total

: 322960K->68224K(341376K), 0.3064430 secs] 1552661K->1316380K(2286976K), 0.3068160 secs] [Times: user=2.05 sys=0.02,

real=0.31 secs]

30943.112: [GC 30943.112: [ParNew

Desired survivor size 34930688 bytes, new threshold 2 (max 15)

- age 1: 21337224 bytes, 21337224 total

- age 2: 28749016 bytes, 50086240 total

: 341376K->68224K(341376K), 0.3763560 secs] 1589532K->1335548K(2286976K), 0.3767090 secs] [Times: user=2.68 sys=0.05,

real=0.38 secs]

30967.269: [GC 30967.269: [ParNew

Desired survivor size 34930688 bytes, new threshold 2 (max 15)

- age 1: 19882256 bytes, 19882256 total

- age 2: 20090752 bytes, 39973008 total

: 341336K->66012K(341376K), 0.3809380 secs] 1608661K->1361482K(2286976K), 0.3813470 secs] [Times: user=2.43 sys=0.04,

real=0.39 secs]

31004.752: [GC 31004.752: [ParNew

Desired survivor size 34930688 bytes, new threshold 2 (max 15)

- age 1: 21067240 bytes, 21067240 total

- age 2: 17356488 bytes, 38423728 total

: 339164K->49887K(341376K), 0.1708590 secs] 1634634K->1364287K(2286976K), 0.1712090 secs]

GCViewer

Oppgave

Konklusjon

http://labs.finn.no – http://labs.skiinfo.com

[email protected]

http://twitter.com/spjelkavik

http://groups.google.com/group/opptur

https://visualvm.dev.java.net/ http://www.yourkit.com/ http://kirk.blog-city.com/ http://tkyte.blogspot.com/

• Ved unormal oppførsel...

• ...må vi ta vare på tilstrekkelig med info

– Jstack, over tid, jmap

– Hprof

– Applikasjonslogger

– Netstat, vmstat

– OS-logger/grafer (Munin / Melody)

• Sakichi Toyoda: 5 Whys!