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

50 shades of concurrency

Embed Size (px)

DESCRIPTION

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

Citation preview

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