jz2010 hvordan enkel analyse kan øke stabiliteten og hastigheten

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

Upload: henning-spjelkavik

Post on 29-Jul-2015

572 views

Category:

Technology


0 download

TRANSCRIPT

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!