50 shades of concurrency

167
50 Shades of Concurrency viernes, 27 de septiembre de 13

Upload: michael-klishin

Post on 10-May-2015

210 views

Category:

Technology


1 download

DESCRIPTION

Concurrency is about algorithms, understandability and predictability. This talk demonstrates this with some examples and war stories derived from several years of experience.

TRANSCRIPT

Page 1: 50 shades of concurrency

50 Shades of Concurrency

viernes, 27 de septiembre de 13

Page 2: 50 shades of concurrency

About me

viernes, 27 de septiembre de 13

Page 3: 50 shades of concurrency

About me

@michaelklishin

viernes, 27 de septiembre de 13

Page 4: 50 shades of concurrency

About me

viernes, 27 de septiembre de 13

Page 5: 50 shades of concurrency

About me

clojurewerkz.org

viernes, 27 de septiembre de 13

Page 6: 50 shades of concurrency

About me

Ex-Travis CI core

viernes, 27 de septiembre de 13

Page 7: 50 shades of concurrency

About me

viernes, 27 de septiembre de 13

Page 8: 50 shades of concurrency

About medata processing

and analytics

viernes, 27 de septiembre de 13

Page 9: 50 shades of concurrency

About medozen of programming

languages, <3 ƛ

viernes, 27 de septiembre de 13

Page 10: 50 shades of concurrency

About merecognized animated

gifs expert

viernes, 27 de septiembre de 13

Page 11: 50 shades of concurrency

About this talk

viernes, 27 de septiembre de 13

Page 12: 50 shades of concurrency

About this talk

N lightning talkscombined

viernes, 27 de septiembre de 13

Page 13: 50 shades of concurrency

About this talk

Multiple relatedtopics

viernes, 27 de septiembre de 13

Page 14: 50 shades of concurrency

About this talk

Observations

viernes, 27 de septiembre de 13

Page 15: 50 shades of concurrency

About this talk

Rants

viernes, 27 de septiembre de 13

Page 16: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 17: 50 shades of concurrency

Do we really need concurrency?

viernes, 27 de septiembre de 13

Page 18: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 19: 50 shades of concurrency

The shit is just too damn hard

viernes, 27 de septiembre de 13

Page 20: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 21: 50 shades of concurrency

Do we need concurrency?

viernes, 27 de septiembre de 13

Page 22: 50 shades of concurrency

«In 2013 alone, IP traffic is expected to grow by around 14 exabytes per month…» — ITU

viernes, 27 de septiembre de 13

Page 23: 50 shades of concurrency

Exabyte? LOLWUT?

viernes, 27 de septiembre de 13

Page 24: 50 shades of concurrency

Exabyte

• 10^18 bytes

viernes, 27 de septiembre de 13

Page 25: 50 shades of concurrency

Exabyte

• 10^18 bytes

• 1,000 petabytes

viernes, 27 de septiembre de 13

Page 26: 50 shades of concurrency

Exabyte

• 10^18 bytes

• 1,000 petabytes

• 1,000,000,000 gigabytes

viernes, 27 de septiembre de 13

Page 27: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 28: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 29: 50 shades of concurrency

If your project is data-driven, concurrency is no

longer a nice-to-have

viernes, 27 de septiembre de 13

Page 30: 50 shades of concurrency

Do we need concurrency?

viernes, 27 de septiembre de 13

Page 31: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 32: 50 shades of concurrency

Timely updates from N sourcesis a UI feature

viernes, 27 de septiembre de 13

Page 33: 50 shades of concurrency

Products compete onuser experience

viernes, 27 de septiembre de 13

Page 34: 50 shades of concurrency

Reasonably responsiveUI or GTFO

viernes, 27 de septiembre de 13

Page 35: 50 shades of concurrency

Do we need concurrency?

viernes, 27 de septiembre de 13

Page 36: 50 shades of concurrency

The world around us is concurrent

viernes, 27 de septiembre de 13

Page 37: 50 shades of concurrency

Pull iPhone headphones jack when the track is

being switched

viernes, 27 de septiembre de 13

Page 38: 50 shades of concurrency

Why it happens?

viernes, 27 de septiembre de 13

Page 39: 50 shades of concurrency

Race condition

viernes, 27 de septiembre de 13

Page 40: 50 shades of concurrency

Race conditions, explained

viernes, 27 de septiembre de 13

Page 41: 50 shades of concurrency

Do we need concurrency?

viernes, 27 de septiembre de 13

Page 42: 50 shades of concurrency

Do we need to understand

concurrency?

viernes, 27 de septiembre de 13

Page 43: 50 shades of concurrency

«my framework will solve this problem for

me!»

viernes, 27 de septiembre de 13

Page 44: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 45: 50 shades of concurrency

require "mutex"

m = Mutex.new

m.synchronize do m.synchronize do # ... endend

viernes, 27 de septiembre de 13

Page 46: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 47: 50 shades of concurrency

ThreadError: deadlock; recursive locking from (irb):4:in `synchronize' from (irb):4:in `block in irb_binding' from (irb):4:in `synchronize'

viernes, 27 de septiembre de 13

Page 48: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 49: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 50: 50 shades of concurrency

«Deadlock describes a situation when one or

more threads are blocked waiting on

each other…»

viernes, 27 de septiembre de 13

Page 51: 50 shades of concurrency

require "mutex"

m = Mutex.new

m.synchronize do m.synchronize do # ... endend

viernes, 27 de septiembre de 13

Page 52: 50 shades of concurrency

Unfortunately, Ruby standard library has more poor design decisions w.r.t. concurrency

viernes, 27 de septiembre de 13

Page 53: 50 shades of concurrency

Solvable?

viernes, 27 de septiembre de 13

Page 54: 50 shades of concurrency

require “monitor”

viernes, 27 de septiembre de 13

Page 55: 50 shades of concurrency

5-10% throughput decrease

viernes, 27 de septiembre de 13

Page 56: 50 shades of concurrency

Backwards compatiblity

viernes, 27 de septiembre de 13

Page 57: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 58: 50 shades of concurrency

Mutexes, explained

viernes, 27 de septiembre de 13

Page 59: 50 shades of concurrency

Mutexes, explained

viernes, 27 de septiembre de 13

Page 60: 50 shades of concurrency

«I know, Java is incredibly solid and

stable!»

viernes, 27 de septiembre de 13

Page 61: 50 shades of concurrency

Map<String, Integer> m = new HashMap<>();

m.put("michael", 3);

viernes, 27 de septiembre de 13

Page 62: 50 shades of concurrency

results in…

viernes, 27 de septiembre de 13

Page 63: 50 shades of concurrency

CPU usage spikes

viernes, 27 de septiembre de 13

Page 64: 50 shades of concurrency

HashMap can create infinite loops internally if you write to

it concurrently, and a write causes a resize.

viernes, 27 de septiembre de 13

Page 65: 50 shades of concurrency

When I find myself in times of troubleProf. Doug Lea comes to meCoding lines of wisdomj.u.c.

viernes, 27 de septiembre de 13

Page 66: 50 shades of concurrency

java.util.concurrent

viernes, 27 de septiembre de 13

Page 67: 50 shades of concurrency

«My VM will solve the problem for me!»

viernes, 27 de septiembre de 13

Page 68: 50 shades of concurrency

Very GC/allocations heavy algorithm

implemented in Clojure

viernes, 27 de septiembre de 13

Page 69: 50 shades of concurrency

«abysmal multicore performance, especially on AMD processors…»

https://groups.google.com/d/topic/clojure/48W2eff3caU/discussion

viernes, 27 de septiembre de 13

Page 70: 50 shades of concurrency

~100 replies and 20 participants later…

viernes, 27 de septiembre de 13

Page 71: 50 shades of concurrency

The bottleneck is…

viernes, 27 de septiembre de 13

Page 72: 50 shades of concurrency

OpenJDK/Oracle JDK memory allocator

viernes, 27 de septiembre de 13

Page 73: 50 shades of concurrency

LOLWUT?

viernes, 27 de septiembre de 13

Page 74: 50 shades of concurrency

«It’s C++ and a few billions of $worth of engineering man-hours!»

viernes, 27 de septiembre de 13

Page 75: 50 shades of concurrency

Not every algorithm has concurrent alternatives

viernes, 27 de septiembre de 13

Page 76: 50 shades of concurrency

Efficient, concurrent writes is a hard

problem

viernes, 27 de septiembre de 13

Page 77: 50 shades of concurrency

Lock contention

viernes, 27 de septiembre de 13

Page 78: 50 shades of concurrency

Lock contention, exlained

viernes, 27 de septiembre de 13

Page 79: 50 shades of concurrency

Lock contention, exlained

viernes, 27 de septiembre de 13

Page 80: 50 shades of concurrency

Memory models

viernes, 27 de septiembre de 13

Page 81: 50 shades of concurrency

«My compiler will solve the problem for me!»

viernes, 27 de septiembre de 13

Page 82: 50 shades of concurrency

Compilers are very sophisticatedtools and can do a lot for you.

But they still need your help from time to time.

viernes, 27 de septiembre de 13

Page 83: 50 shades of concurrency

False sharing

viernes, 27 de septiembre de 13

Page 84: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 85: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 86: 50 shades of concurrency

False sharing

viernes, 27 de septiembre de 13

Page 87: 50 shades of concurrency

class Metrics attr_accessor :signin_requests attr_accessor :signout_requestsend

viernes, 27 de septiembre de 13

Page 88: 50 shades of concurrency

Thread A updates :signin_requests

viernes, 27 de septiembre de 13

Page 89: 50 shades of concurrency

Thread B updates :signout_requests

viernes, 27 de septiembre de 13

Page 90: 50 shades of concurrency

CPU caches

viernes, 27 de septiembre de 13

Page 91: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 92: 50 shades of concurrency

Memory is stored inCPU caches in chunks

viernes, 27 de septiembre de 13

Page 93: 50 shades of concurrency

The chunks are knownas cache lines

viernes, 27 de septiembre de 13

Page 94: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 95: 50 shades of concurrency

Cache line

viernes, 27 de septiembre de 13

Page 96: 50 shades of concurrency

Cache line

Thread Aupdates

viernes, 27 de septiembre de 13

Page 97: 50 shades of concurrency

Cache line

Thread Bupdates

viernes, 27 de septiembre de 13

Page 98: 50 shades of concurrency

Cache line

RAM

viernes, 27 de septiembre de 13

Page 99: 50 shades of concurrency

Threads update independent variables,but the entire cache line ishas to be read from RAM

viernes, 27 de septiembre de 13

Page 100: 50 shades of concurrency

Solvable?

viernes, 27 de septiembre de 13

Page 101: 50 shades of concurrency

public final class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6;}

viernes, 27 de septiembre de 13

Page 102: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 103: 50 shades of concurrency

«Threads suck! UNIX processes willsolve my problem!»

viernes, 27 de septiembre de 13

Page 104: 50 shades of concurrency

fork(2)

viernes, 27 de septiembre de 13

Page 105: 50 shades of concurrency

fork(2) vs forkall(2)

viernes, 27 de septiembre de 13

Page 106: 50 shades of concurrency

fork(2) and parent processthat holds mutex(es)

viernes, 27 de septiembre de 13

Page 107: 50 shades of concurrency

async signal safe

viernes, 27 de septiembre de 13

Page 108: 50 shades of concurrency

«The child inherits copies of the parent's set of open file descriptors…»

viernes, 27 de septiembre de 13

Page 109: 50 shades of concurrency

«All APIs, including global data symbols, in any framework or library should be assumed to be

unsafe after a fork() unless explicitly documented to be safe or async-signal safe…»

viernes, 27 de septiembre de 13

Page 110: 50 shades of concurrency

man 2 fork, CAVEATS

viernes, 27 de septiembre de 13

Page 111: 50 shades of concurrency

man 2 vfork

viernes, 27 de septiembre de 13

Page 112: 50 shades of concurrency

Process race conditions

viernes, 27 de septiembre de 13

Page 113: 50 shades of concurrency

Not that many concurrencylibraries for processes

viernes, 27 de septiembre de 13

Page 114: 50 shades of concurrency

«My OS will solve the problem for me!»

viernes, 27 de septiembre de 13

Page 115: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 116: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 117: 50 shades of concurrency

Cooperative concurrency, explained

viernes, 27 de septiembre de 13

Page 118: 50 shades of concurrency

Cooperative concurrency, explained

viernes, 27 de septiembre de 13

Page 119: 50 shades of concurrency

Preemptive scheduling

viernes, 27 de septiembre de 13

Page 120: 50 shades of concurrency

Scheduling

viernes, 27 de septiembre de 13

Page 121: 50 shades of concurrency

C10K

viernes, 27 de septiembre de 13

Page 122: 50 shades of concurrency

C100M

viernes, 27 de septiembre de 13

Page 123: 50 shades of concurrency

Lightweight processes

viernes, 27 de septiembre de 13

Page 124: 50 shades of concurrency

Erlang, Clojure’s core.async, Go

viernes, 27 de septiembre de 13

Page 125: 50 shades of concurrency

Lightweight processes: the Holy Grail?

viernes, 27 de septiembre de 13

Page 126: 50 shades of concurrency

Dat single Erlang process bottleneck

viernes, 27 de septiembre de 13

Page 127: 50 shades of concurrency

Unbounded mailboxes and backpressure

viernes, 27 de septiembre de 13

Page 128: 50 shades of concurrency

Race conditions

viernes, 27 de septiembre de 13

Page 129: 50 shades of concurrency

Deadlocks in Erlang

viernes, 27 de septiembre de 13

Page 130: 50 shades of concurrency

Livelocks in Erlang

viernes, 27 de septiembre de 13

Page 131: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 132: 50 shades of concurrency

viernes, 27 de septiembre de 13

Page 133: 50 shades of concurrency

Concurrency is about algorithms

viernes, 27 de septiembre de 13

Page 134: 50 shades of concurrency

Correctness

viernes, 27 de septiembre de 13

Page 135: 50 shades of concurrency

Race conditions are possible with any

language

viernes, 27 de septiembre de 13

Page 136: 50 shades of concurrency

Concurrency makes it harder to reason about

correctness

viernes, 27 de septiembre de 13

Page 137: 50 shades of concurrency

Most issues arise from shared mutable state

viernes, 27 de septiembre de 13

Page 138: 50 shades of concurrency

Solvable?

viernes, 27 de septiembre de 13

Page 139: 50 shades of concurrency

Solutions

•Eliminate shared state

viernes, 27 de septiembre de 13

Page 140: 50 shades of concurrency

Solutions

•Eliminate shared state

•Use immutable data structures

viernes, 27 de septiembre de 13

Page 141: 50 shades of concurrency

«Immutable? But how do I change anything?»

viernes, 27 de septiembre de 13

Page 142: 50 shades of concurrency

Immutable data structures create

copies when updated (mutated)

viernes, 27 de septiembre de 13

Page 143: 50 shades of concurrency

«But copying is expensive!»

viernes, 27 de septiembre de 13

Page 144: 50 shades of concurrency

Copying doesn’t have to be a naïve “full copy”

viernes, 27 de septiembre de 13

Page 145: 50 shades of concurrency

Value immutability vsreference immutability

viernes, 27 de septiembre de 13

Page 146: 50 shades of concurrency

Value immutability: Haskell, Clojure, Erlang.

viernes, 27 de septiembre de 13

Page 147: 50 shades of concurrency

Reference immutability: C++, Java, Scala, Rust.

viernes, 27 de septiembre de 13

Page 148: 50 shades of concurrency

Value immutability: libraries for any

language (Ruby, Java, JS)

viernes, 27 de septiembre de 13

Page 149: 50 shades of concurrency

Immutability and message passing make reasoning

much easierviernes, 27 de septiembre de 13

Page 150: 50 shades of concurrency

Summary

viernes, 27 de septiembre de 13

Page 151: 50 shades of concurrency

Concurrency is no longer a nice-to-have

viernes, 27 de septiembre de 13

Page 152: 50 shades of concurrency

There is no such thing as a “thread safe framework”

viernes, 27 de septiembre de 13

Page 153: 50 shades of concurrency

Concurrency is about

algorithmsviernes, 27 de septiembre de 13

Page 154: 50 shades of concurrency

Algorithms are different at every level

viernes, 27 de septiembre de 13

Page 155: 50 shades of concurrency

Problems are different at every level

viernes, 27 de septiembre de 13

Page 156: 50 shades of concurrency

No substitute for

understandingviernes, 27 de septiembre de 13

Page 157: 50 shades of concurrency

Being able to reason about your program

mattersviernes, 27 de septiembre de 13

Page 158: 50 shades of concurrency

Immutability and message passing make reasoning

much easierviernes, 27 de septiembre de 13

Page 159: 50 shades of concurrency

Not about event loops or Web

Scale™viernes, 27 de septiembre de 13

Page 160: 50 shades of concurrency

Concurrency is the new Cloud Computing

viernes, 27 de septiembre de 13

Page 161: 50 shades of concurrency

Concurrency is the new Clown Computering

viernes, 27 de septiembre de 13

Page 162: 50 shades of concurrency

«Blah blah, X blows Y out of the water in concurrency…»

viernes, 27 de septiembre de 13

Page 163: 50 shades of concurrency

Be specific or GTFO

viernes, 27 de septiembre de 13

Page 164: 50 shades of concurrency

Start learning a language with

immutable data structures today

viernes, 27 de septiembre de 13

Page 165: 50 shades of concurrency

clojure-doc.org

viernes, 27 de septiembre de 13

Page 166: 50 shades of concurrency

Thank you

viernes, 27 de septiembre de 13

Page 167: 50 shades of concurrency

@michaelklishinclojurewerkz.org

viernes, 27 de septiembre de 13