Czterej jeźdźcy apokalipsy gdy Armagedon w JVM nadchodzi

70
Czterej jeźdźcy apokalipsy gdy Armagedon w JVM nadchodzi.

Transcript of Czterej jeźdźcy apokalipsy gdy Armagedon w JVM nadchodzi

Page 1: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Czterej jeźdźcy apokalipsy gdy Armagedon w JVM nadchodzi.

Page 2: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi
Page 3: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

• chief architect @ Lumesse• owner/founder/one man orchestra @

symentis.pl• blogger @ geekyprimitives.wordpress.com• philosopher @ twitter:j_palka• code mangler @ bitbucket:kcrimson &

github:jpalka• evil emperor @ 4developers conf/architecture

track• restrained Padawan @ church of JVM

Page 4: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Celem tej prezentacji jest pokazanie Technik, których na co dzień nie będziecie

Stosować

Ten materiał zakłada, że na co dzień nie zgłębiacie terenów przygranicznych

System operacyjny/maszyna wirtualna

Zaprezentowane poniżej informacje i fakty mogą trwale odmienić wasze postrzeganie

rzeczywistości

Page 5: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Dopiero zaczynasz z JVM?Zachwycisz się złożonością

Masz już za sobą pierwszy pad produkcji?Przeklniesz złożoność JVM

Chcesz wiedzieć więcej jak to wszystko działa?

Ta prezentacja łagodnie wprowadzi Cię w terminologię i podstawy

Page 6: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Moją opowieść będę snuł wokół OpenJDK 8

isystemu operacyjnego Linux

Część z tych rzeczy może być prawdą dla innych

JDK i OS

Page 7: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Ale niekoniecznie :)

Page 8: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Opowieść czas zacząć

Page 9: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Pewnego pięknego zimowego wieczorugdzieś w Krakowie, kilka lat temu

Page 10: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi
Page 11: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

O godzinie 4.03Gdy nadzieja już dawno opuściła biuro

A zdrowy rozsądek już dawno wyskoczył za okno

hg clone http://hg.openjdk.java.net/jdk8/jdk8

Page 12: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

apt-get install sysstat

apt-get install strace

apt-get install sysdig

sar -d -R 1strace -f -T -p666

Page 13: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

A mówiła mama nie zaglądać za zamknięte drzwi?

Page 14: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

gdywtem,nagle

iznienacka ...

Page 15: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Z pyłu, sadzy

i dymu, pierwszy jeździec się wyłonił

A imię jego

Page 16: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Garbage Collector

Page 17: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Wiele zrobiono i napisano o automatycznymzarządzaniu pamięcią w JVM

Gdy już ustawisz wszystkie parametryi

przełączniki A

GC nadal będzie zniewalało twój CPU

Jedyne co pozostaje to „off heap memory”

Page 18: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

java.nio.ByteBuffer.allocateDirect()

„may reside outside of garbage collected heap”So called C-heap

Makes famous sun.misc.Unsafe a little bit saferAnd slower:)

But let's talk aboutsun.misc.Unsafe.allocateMemory

Page 19: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Allocation and deallocation is really expensive

Mostly because of costly JNI calls

and NMT (native memory tracking)

Mail thread@hotspot-devUnsafe allocate

Calls OS malloc functionhotspot/src/share/vm/prims/unsafe.cpp

Page 20: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

UNSAFE_ENTRY(jlong, Unsafe_AllocateMemory(JNIEnv *env, jobject unsafe, jlong size)) UnsafeWrapper("Unsafe_AllocateMemory"); size_t sz = (size_t)size; if (sz != (julong)size || size < 0) { THROW_0(vmSymbols::java_lang_IllegalArgumentException()); } if (sz == 0) { return 0; } sz = round_to(sz, HeapWordSize); void* x = os::malloc(sz); if (x == NULL) { THROW_0(vmSymbols::java_lang_OutOfMemoryError()); } //Copy::fill_to_words((HeapWord*)x, sz / HeapWordSize); return addr_to_java(x);UNSAFE_END

Page 21: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Because it uses mallocYou can „easily” provide your own allocator

export LD_PRELOAD=mylib.so

jemalloc (look cassandra case)

Anyway, it all can end up with„core dump”

So be carefull

Or use wrappers

Page 22: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Tools to play withgithub:alexkasko/unsafe-tools

github:peter-lawrey/Java-Chronicleapache-directmemory

Who depends on unsafeehcache (with BigMemory)

hazelcast (with ElasticMemory)infinispan

lucenecassandra

Page 23: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Trade offs, stupid!

Page 24: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Huge,really huge,

Tottaly hugedata structures

Beware!!!lifetime of objects

serialization/deserialization

Page 25: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

… and then Jigsaw cameAnd changed the game

C-Heap APIbecause

people are actually using it(broken window)

Unsafe at any SpeedPublic sun.misc.Unsafe Replacement API

No plans for JDK9 so far

Page 26: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

I ziemia się rozstąpiłaI ogień piekielny z ziemi wypełzać począł

drugi jeździec się wyłoniłA imię jego

Page 27: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Input / Output

Page 28: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Block deviceDevice driver

IO scheduler (merge/sort)

I/O request

Page 29: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

%iowaitDevice queue size

Time spent on the queue

iostat ­x ­d sda 1

Page 30: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

avgqu­sz average queue length for this device

awaitaverage response time (ms) of IO requests to a

device.

svctimaverage time (ms) a device was servicing requests.

qutim = await ­ svctim 

Page 31: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

qutim

Czas który JVM traci na oczekiwanie na operacje IO

Page 32: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

select() (POSIX)epoll() (Linux)kqueue (*BSD)/dev/poll

Page 33: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

syscallrequests a service from

kernel

userspacekernelspace

CPU privileged mode

glibc

Page 34: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi
Page 35: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

sun.nio.ch.DefaultSelectorProvider if ("Linux".equals(osname)) { String osversion = AccessController.doPrivileged( new GetPropertyAction("os.version")); String[] vers = osversion.split("\\.", 0); if (vers.length >= 2) { try { int major = Integer.parseInt(vers[0]); int minor = Integer.parseInt(vers[1]); if (major > 2 || (major == 2 && minor >= 6)) { return new sun.nio.ch.EPollSelectorProvider(); } } catch (NumberFormatException x) { // format not recognized } } }

return new sun.nio.ch.PollSelectorProvider();

Page 36: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

java.nio

Event loops

Reactor pattern

Page 37: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Nie bądź głupiUżyj

netty.io

Page 38: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Bufory IO pomiędzykernel space

Iuser space

Operacje IO wymagają wielu operacjiKopiowania pomiędzy userspace i kernelspace

DMAmmap()

MMU

Page 39: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi
Page 40: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Here was slide about

Memory mapped files & page faults,

But somebody removed it :)

Page 41: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

… and here was slide about

Vectored IO

But somebody else removed it :)

Page 42: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

kernel-user space „zero copy”

FileChannel#transferTo()

wewnątrz JVM „zero copy”

użyj Netty, serio

CompositeByteBuf

Page 43: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Trade offs, stupid!

Page 44: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Blokować?

Nie blokuj gdy,Dużo klientów masz

Blokuj gdy,Strumienie przetwarzasz

Page 45: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

CPUs and hard drives are really good at

sequential reading/writing

Use it

Page 46: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

I grom potężny pazurem swym nieboskłon na strzępy rozdarł

trzeci jeździec się wyłoniłA imię jego

Page 47: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

synchronized

Page 48: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Z pozoru wszystko wygląda niewinnie

%systemContext switches

Voluntary (IO wait, syscall*) Non voluntary (within time slice)

pidstat ­w ­t ­I ­p {pid}jstack {pid}

Page 49: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

WaitingIs

waste

Page 50: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Non blocking algorithms

Wait-freedomKażda operacja zakończy się w z góry określonej

ilości kroków/ instrukcji

Lock-freedomPozwala na zagłodzienie wybranych wątków, Przynajmniej jeden wątek wykonuje operacje

Obstruction-freedom (optimistic concurrency)

Page 51: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Compare-and-swap

java.util.concurrent.atomic

„transakcyjne” metodyCopy on write

Persistent data structures

Page 52: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Atomic operations are

getting faster and fasterWith every new CPU

But we are not there yet!

Page 53: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

I wody z oceanów wystąpiły, A z nich bestie żarłoczne,

Człowiekowi nieprzychylneczwarty jeździec się wyłonił

A imię jego

Page 54: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Just In Time compiler

Page 55: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Adaptive runtime

Based on profiling dataSlower startup times

Slower peek peformance(in some cases*)

Page 56: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

JIT (Just in Time)HotSpot

Vs

AOT (Ahead of Time)(www.excelsiorjet.com)

Page 57: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Interpreter

C1 compiler

C2 compiler

OSR (on stack replacement)

deoptimization

Page 58: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Inlining

mother of all optimizations

C1 compilerinlines small methods

-XX:MaxInlineSize=35-XX:InlineSmallCode=2000

C2 compilerinlines „hot” methods

-XX:FreqInlineSize=325

Page 59: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

public class Inline{

public int doubleAndSum(int x,y){ return makeDouble(x)+makeDouble(y); }

private int makeDouble(int x){ return x+x; }

//after inlining public int doubleAndSum(int x,y){ return (x+x)+(y+y); }

}

Page 60: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

The easy part

private, static and final

The hard part

Polimorphism

Class hierarchy analisys

Deoptimization

Beware of megamorph

Page 61: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

const char* StackWalkCompPolicy::shouldInline(methodHandle m, float freq, int cnt) { // Allows targeted inlining // positive filter: should send be inlined? returns NULL (--> yes) // or rejection msg int max_size = MaxInlineSize; int cost = m->code_size();

// Check for too many throws (and not too huge) if (m->interpreter_throwout_count() > InlineThrowCount && cost < InlineThrowMaxSize ) { return NULL; }

// bump the max size if the call is frequent if ((freq >= InlineFrequencyRatio) || (cnt >= InlineFrequencyCount)) { if (TraceFrequencyInlining) { tty->print("(Inlined frequent method)\n"); m->print(); } max_size = FreqInlineSize; } if (cost > max_size) { return (_msg = "too big"); } return NULL;}

Page 62: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Inline cache

Inline depth

Recursive inline

Page 63: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

other optimizations

remove redundant loads

loop unrollling

global value numbering

intrinsic

escape analisys

Page 64: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

… And few others even more interesting

lock elision

lock coarsenning

adaptive locking

biased locking

Page 65: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

But first few words about

„fat”

and

„thin” locks

Page 66: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

JVM uses futexA „mostly” userspace lock

based on atomic value and wait queue

Unless

high contentionwhich forces futex

to use kernelspacemutex

Page 67: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

WAT?

Page 68: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Daleko jeszcze?

Page 69: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

What Every Programmer Should Know About Memory

Cpu Caches and Why You Care

Lock-Free Programming (or, Juggling Razor Blades)

brain food for hackers

Linux Device Drivers

Page 70: Czterej jeźdźcy apokalipsy  gdy Armagedon w JVM nadchodzi

Let the eternal stream of byte codeFlows through your body