Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31%...

89
The Art of JVM Profiling Andrei Pangin Vadim Tsesko 2017

Transcript of Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31%...

Page 1: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

The Art ofJVM Profiling

Andrei Pangin Vadim Tsesko

2017

Page 2: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

2

http://recetasfamilia.com/escala-scoville/

Page 3: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

● 48 M DAU ● 8500 machines in 4 DC ● 1.2 Tb/s ● Up to 70 К QPS/server ● 99% < 100 ms

Одноклассники

3

Java

Page 4: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Profilers0

Page 5: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• IO (disk, network) • syscalls • Synchronisation • SQL queries • …

What to profile?

5

Page 6: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

How to profile?

6

Page 7: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

How to profile?

Instrumenting • Trace method transitions • Measure/count

• Slooow

6

Page 8: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

How to profile?

Instrumenting • Trace method transitions • Measure/count

• Slooow

Sampling • Snapshot state • Periodic

• Suitable for PROD

6

Page 9: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Thread Dump1

Page 10: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Java Thread.getAllStackTraces()

How does it work?

Native (JVM TI) GetAllStackTraces()

class StackTraceElement { String declaringClass; String methodName; String fileName; int lineNumber;}

struct { jmethodID method; jlocation location;}

Page 11: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Overhead

9

Page 12: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Overhead

9

• 1K threads ~ 10 MB • up to 50 ms

Page 13: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• Simple • All Java platforms and versions • No JVM options needed

• VisualVM, Java Mission Control, YourKit, JProfiler, ...

Advantages

10

Page 14: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

DEMO

11

Page 15: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

memory access

Safepoint

return

math

loop

Thread 1 Thread 2

safepointrequest

12

Page 16: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

memory access

safepointstart

Safepoint

return

math

loop

Thread 1 Thread 2

safepointrequest

12

Page 17: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

memory access

safepointstart

Safepoint

return

math

loop

Thread 1 Thread 2

safepointrequest

13

Are we there yet?

Page 18: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

for-looppublic Theme getThemeById(Long id) { for (int i = 0; i < themes.length; i++) { if (id.equals(themes[i].getId())) { return themes[i]; } } return null;}

Page 19: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

for-looppublic Theme getThemeById(Long id) { for (int i = 0; i < themes.length; i++) { if (id.equals(themes[i].getId())) { return themes[i]; } } return null;}

-XX:+UseCountedLoopSafepoints

Page 20: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• Useless • Unreliable • It happens

https://jug.ru/2016/05/андрей-паньгин-всё-что-вы-хотели-зна/ http://psy-lob-saw.blogspot.ru/2016/02/why-most-sampling-java-profilers-are.html

Safepoints make profiling

15

Page 21: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

DEMO

16

Page 22: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• All threads • Native → RUNNABLE • How to interpret?

Off CPU

17

Page 23: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Problems ● Safepoints ● Off CPU ● Native

Can we do better?

18

Page 24: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Problems ● Safepoints ● Off CPU ● Native

Can we do better?

18

Page 25: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

AsyncGetCallTrace2

Page 26: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

How does it work?

20

AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext)

from signal handleritimer() + SIGPROF

Page 27: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• Oracle Developer Studio • github.com/jvm-profiling-tools/honest-profiler • github.com/apangin/async-profiler

How does it work?

20

AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext)

from signal handleritimer() + SIGPROF

Page 28: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

DEMO

21

Page 29: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• Not limited to safepoints -XX:+DebugNonSafepoints

• Active threads • All Java: interpreted, compiled, inlined

Advantages

22

Page 30: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Windows Native JVM (GC, compiler…)

Disadvantages

23

Page 31: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

DEMO

24

Page 32: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Problemsenum { ticks_no_Java_frame = 0, ticks_no_class_load = -1, ticks_GC_active = -2, ticks_unknown_not_Java = -3, ticks_not_walkable_not_Java = -4, ticks_unknown_Java = -5, ticks_not_walkable_Java = -6, ticks_unknown_state = -7, ticks_thread_exit = -8, ticks_deopt = -9, ticks_safepoint = -10 };

src/share/vm/prims/forte.cpp

25

Page 33: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Inconsistent framemov %eax,-0x6000(%rsp) push %rbp sub $0x30,%rsp

mov 0xc(%rdx),%eax

add $0x30,%rsp pop %rbp test %eax,-0x12345a(%rip) retq

public int getX() { return x;}

26

Page 34: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Inconsistent framemov %eax,-0x6000(%rsp) push %rbp sub $0x30,%rsp

mov 0xc(%rdx),%eax

add $0x30,%rsp pop %rbp test %eax,-0x12345a(%rip) retq

public int getX() { return x;}

Epilogue

Prologue

26

Page 35: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Workaround

1. Fix SP, IP 2. Retry AsyncGetCallTrace()unknown_Java < 0.05%

bugs.openjdk.java.net/browse/JDK-8178287

27

Page 36: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

DEMO

28

Page 37: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Visualisation3

Page 38: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Flat

30

Page 39: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Tree

31

Page 40: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

DEMO

32

● brendangregg.com

Page 41: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Problems ● Safepoints ● Off CPU ● Native

Can we do better?

33

Page 42: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Perf Events4

Page 43: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

PMU

35

Page 44: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

PMU

• HW Events • Cycles, instructions • Cache misses, branch misses

HW interrupts

35

Page 45: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

PMU

• HW Events • Cycles, instructions • Cache misses, branch misses

HW interrupts

• SW events • CPU clock • Page faults • Context switches

35

Page 46: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• Linux syscall • fd → counter • mmap page → samples

perf_event_open()

36

Page 47: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

• Linux syscall • fd → counter • mmap page → samples

perf_event_open()

S

S

• Samples • pid, tid • CPU registers • Call chain (user + kernel)

36

Page 48: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

perf$ perf record –F 999 java ...$ perf report

perf.wiki.kernel.org/index.php/Tutorial37

Page 49: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

perf$ perf record –F 999 java ...$ perf report

4.70% java [kernel.kallsyms] [k] clear_page_c 2.10% java libpthread-2.17.so [.] pthread_cond_wait 1.97% java libjvm.so [.] Unsafe_Park 1.40% java libjvm.so [.] Parker::park 1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e 1.17% java perf-18762.map [.] 0x00007f8510e9cc17

perf.wiki.kernel.org/index.php/Tutorial37

Page 50: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

perf$ perf record –F 999 java ...$ perf report

4.70% java [kernel.kallsyms] [k] clear_page_c 2.10% java libpthread-2.17.so [.] pthread_cond_wait 1.97% java libjvm.so [.] Unsafe_Park 1.40% java libjvm.so [.] Parker::park 1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e 1.17% java perf-18762.map [.] 0x00007f8510e9cc17

perf.wiki.kernel.org/index.php/Tutorial37

Page 51: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Java symbols

38

● No symbols for JITted code ● /tmp/perf-<pid>.map

7fe0e9117220 80 java.lang.Object::<init> 7fe0e91175e0 140 java.lang.String::hashCode 7fe0e9117900 20 java.lang.Math::min 7fe0e9117ae0 60 java.lang.String::length 7fe0e9117d20 180 java.lang.String::indexOf

Page 52: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

JVM TI

39

CompiledMethodLoad() // Compiled Java DynamicCodeGenerated() // VM Runtime

$ java -agentpath:/usr/lib/libperfmap.so …

github.com/jrudolph/perf-map-agent

Page 53: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

0

ret1prev BP BP

SP

Native stack

40

Page 54: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

0

ret1prev BP

ret2prev BP BP

SP

Native stack

40

Page 55: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

0

ret1prev BP

ret2prev BP BP

SP

method 1

method 2

current method

Native stack IP

40

Page 56: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

0

ret1prev BP

ret2prev BP BP

SP

method 1

method 2

current method

Native stack IP

40

Page 57: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

ret1

ret2

SP

Java stack

BP

41

Page 58: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

ret1

ret2

SP

Java stack

BP

-XX:+PreserveFramePointer

41

Page 59: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

DEMO

42

$ perf record -F $HZ -o $RAW -g -p $PID -- sleep $SEC

$ FlameGraph/stackcollapse-perf.pl $PERF > $STACKS

$ FlameGraph/flamegraph.pl $STACKS > $SVG

$ perf script -i $RAW > $PERF

github.com/brendangregg/FlameGraph

Page 60: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

App startup

Page 61: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

App startupWTF?!

Page 62: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Hot interpreter

44

Page 63: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Hot interpreter

com.maxmind.geoip.RegionName::regionNameByCode

44

Page 64: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Poor GeoIP library if (country_code.equals("RU")) { switch (region_code) { case 1: name = "Adygeya"; break; case 2: name = "Aginsky Buryatsky AO"; break; case 3: name = "Gorno-Altaysk"; break; ...

45

Page 65: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Poor GeoIP library if (country_code.equals("RU")) { switch (region_code) { case 1: name = "Adygeya"; break; case 2: name = "Aginsky Buryatsky AO"; break; case 3: name = "Gorno-Altaysk"; break; ... -XX:-DontCompileHugeMethods

45

Page 66: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

Page 67: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

● No interpreted Java● -XX:+PreserveFramePointer

Page 68: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

● No interpreted Java● -XX:+PreserveFramePointer● Java ≥ 8u60

Page 69: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

● No interpreted Java● -XX:+PreserveFramePointer● Java ≥ 8u60● JIT recompile

Page 70: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

● No interpreted Java● -XX:+PreserveFramePointer● Java ≥ 8u60● JIT recompile● /proc/sys/kernel/perf_event_paranoid

Page 71: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

● No interpreted Java● -XX:+PreserveFramePointer● Java ≥ 8u60● JIT recompile● /proc/sys/kernel/perf_event_paranoid● Limited stack depth

Page 72: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

● No interpreted Java● -XX:+PreserveFramePointer● Java ≥ 8u60● JIT recompile● /proc/sys/kernel/perf_event_paranoid● Limited stack depth● Unstable (many threads)

Page 73: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Disadvantages

46

● No interpreted Java● -XX:+PreserveFramePointer● Java ≥ 8u60● JIT recompile● /proc/sys/kernel/perf_event_paranoid● Limited stack depth● Unstable (many threads)● Big data :)

Page 74: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Full-stack Profiler5

Page 75: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Ideal profiler

• Kernel + native stacks • HW counters

• Full Java stack • Fast and simple

perf_event_open()

AsyncGetCallTrace()

48

Page 76: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Put together

readBytessystem_call_fastpath

sys_read

xfs_file_aio_read

perf

SSSIGIO

Page 77: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Put together

java.io.FileInputStream::readBytesjava.io.FileInputStream::read

JavaApp::main

readBytessystem_call_fastpath

sys_read

xfs_file_aio_read

perf

SS

AsyncGetCallTrace

SIGIO

Page 78: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Put together

java.io.FileInputStream::readBytesjava.io.FileInputStream::read

JavaApp::main

readBytessystem_call_fastpath

sys_read

xfs_file_aio_read

perf

SS

AsyncGetCallTrace

SIGIO

fcntl(): signal owner = this thread

Page 79: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Issues

• Stack merge point

• Online aggregation • Native symbols

• Event-per-thread • ulimit –n • /proc/sys/kernel/perf_event_mlock_kb

• Concurrency50

Page 80: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Case: file readingbyte[] buf = new byte[bufSize];try (FileInputStream in = new FileInputStream(fileName)) { int bytesRead; while ((bytesRead = in.read(buf)) > 0) { ... }}

Page 81: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Case: file readingbyte[] buf = new byte[bufSize];try (FileInputStream in = new FileInputStream(fileName)) { int bytesRead; while ((bytesRead = in.read(buf)) > 0) { ... }}

Buffer size? ❑ 8 K ❑ 64 K ❑ 250 K ❑ 1 M ❑ 4 M

Page 82: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Full-stack profile

52

Page 83: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Full-stack profile

52

Page 84: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Full-stack profile

53

Read buffer: 260K => 250K

Page 85: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

AsyncGCT Perf Full-stack Profiler

Java stack Yes No interpreted YesNative stack No Yes YesKernel stack No Yes YesJDK version 6+ 8u60+ 6+Idle overhead 0 2-5% 0Online aggregation Yes No YesStable Yes No Yes

54

Page 86: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Performance problem?CPU utilisation?Thread dump

AsyncGetCallTracePerf

Full-stack profilerFuture improvements

55

Page 87: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Try it

• github.com/apangin/async-profiler

• Contributions are welcome!

56

Page 88: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e

Contacts

57

Andrei Pangin @AndreiPangin

Vadim Tsesko @incubos

https://v.ok.ru/vacancies.html

Page 89: Andrey Pangin, Vadim Tsesko. The Art of JVM …1.31% java [kernel.kallsyms] [k] try_to_wake_up 1.31% java perf-18762.map [.] 0x00007f8510e9e757 1.21% java perf-18762.map [.] 0x00007f8510e9e89e