50 shades of concurrency

Post on 10-May-2015

210 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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

50 Shades of Concurrency

viernes, 27 de septiembre de 13

About me

viernes, 27 de septiembre de 13

About me

@michaelklishin

viernes, 27 de septiembre de 13

About me

viernes, 27 de septiembre de 13

About me

clojurewerkz.org

viernes, 27 de septiembre de 13

About me

Ex-Travis CI core

viernes, 27 de septiembre de 13

About me

viernes, 27 de septiembre de 13

About medata processing

and analytics

viernes, 27 de septiembre de 13

About medozen of programming

languages, <3 ƛ

viernes, 27 de septiembre de 13

About merecognized animated

gifs expert

viernes, 27 de septiembre de 13

About this talk

viernes, 27 de septiembre de 13

About this talk

N lightning talkscombined

viernes, 27 de septiembre de 13

About this talk

Multiple relatedtopics

viernes, 27 de septiembre de 13

About this talk

Observations

viernes, 27 de septiembre de 13

About this talk

Rants

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Do we really need concurrency?

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

The shit is just too damn hard

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Do we need concurrency?

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Exabyte? LOLWUT?

viernes, 27 de septiembre de 13

Exabyte

• 10^18 bytes

viernes, 27 de septiembre de 13

Exabyte

• 10^18 bytes

• 1,000 petabytes

viernes, 27 de septiembre de 13

Exabyte

• 10^18 bytes

• 1,000 petabytes

• 1,000,000,000 gigabytes

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

If your project is data-driven, concurrency is no

longer a nice-to-have

viernes, 27 de septiembre de 13

Do we need concurrency?

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Timely updates from N sourcesis a UI feature

viernes, 27 de septiembre de 13

Products compete onuser experience

viernes, 27 de septiembre de 13

Reasonably responsiveUI or GTFO

viernes, 27 de septiembre de 13

Do we need concurrency?

viernes, 27 de septiembre de 13

The world around us is concurrent

viernes, 27 de septiembre de 13

Pull iPhone headphones jack when the track is

being switched

viernes, 27 de septiembre de 13

Why it happens?

viernes, 27 de septiembre de 13

Race condition

viernes, 27 de septiembre de 13

Race conditions, explained

viernes, 27 de septiembre de 13

Do we need concurrency?

viernes, 27 de septiembre de 13

Do we need to understand

concurrency?

viernes, 27 de septiembre de 13

«my framework will solve this problem for

me!»

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

require "mutex"

m = Mutex.new

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

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

«Deadlock describes a situation when one or

more threads are blocked waiting on

each other…»

viernes, 27 de septiembre de 13

require "mutex"

m = Mutex.new

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

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Solvable?

viernes, 27 de septiembre de 13

require “monitor”

viernes, 27 de septiembre de 13

5-10% throughput decrease

viernes, 27 de septiembre de 13

Backwards compatiblity

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Mutexes, explained

viernes, 27 de septiembre de 13

Mutexes, explained

viernes, 27 de septiembre de 13

«I know, Java is incredibly solid and

stable!»

viernes, 27 de septiembre de 13

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

m.put("michael", 3);

viernes, 27 de septiembre de 13

results in…

viernes, 27 de septiembre de 13

CPU usage spikes

viernes, 27 de septiembre de 13

HashMap can create infinite loops internally if you write to

it concurrently, and a write causes a resize.

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

java.util.concurrent

viernes, 27 de septiembre de 13

«My VM will solve the problem for me!»

viernes, 27 de septiembre de 13

Very GC/allocations heavy algorithm

implemented in Clojure

viernes, 27 de septiembre de 13

«abysmal multicore performance, especially on AMD processors…»

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

viernes, 27 de septiembre de 13

~100 replies and 20 participants later…

viernes, 27 de septiembre de 13

The bottleneck is…

viernes, 27 de septiembre de 13

OpenJDK/Oracle JDK memory allocator

viernes, 27 de septiembre de 13

LOLWUT?

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Not every algorithm has concurrent alternatives

viernes, 27 de septiembre de 13

Efficient, concurrent writes is a hard

problem

viernes, 27 de septiembre de 13

Lock contention

viernes, 27 de septiembre de 13

Lock contention, exlained

viernes, 27 de septiembre de 13

Lock contention, exlained

viernes, 27 de septiembre de 13

Memory models

viernes, 27 de septiembre de 13

«My compiler will solve the problem for me!»

viernes, 27 de septiembre de 13

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

False sharing

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

False sharing

viernes, 27 de septiembre de 13

class Metrics attr_accessor :signin_requests attr_accessor :signout_requestsend

viernes, 27 de septiembre de 13

Thread A updates :signin_requests

viernes, 27 de septiembre de 13

Thread B updates :signout_requests

viernes, 27 de septiembre de 13

CPU caches

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Memory is stored inCPU caches in chunks

viernes, 27 de septiembre de 13

The chunks are knownas cache lines

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Cache line

viernes, 27 de septiembre de 13

Cache line

Thread Aupdates

viernes, 27 de septiembre de 13

Cache line

Thread Bupdates

viernes, 27 de septiembre de 13

Cache line

RAM

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Solvable?

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

«Threads suck! UNIX processes willsolve my problem!»

viernes, 27 de septiembre de 13

fork(2)

viernes, 27 de septiembre de 13

fork(2) vs forkall(2)

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

async signal safe

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

«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

man 2 fork, CAVEATS

viernes, 27 de septiembre de 13

man 2 vfork

viernes, 27 de septiembre de 13

Process race conditions

viernes, 27 de septiembre de 13

Not that many concurrencylibraries for processes

viernes, 27 de septiembre de 13

«My OS will solve the problem for me!»

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Cooperative concurrency, explained

viernes, 27 de septiembre de 13

Cooperative concurrency, explained

viernes, 27 de septiembre de 13

Preemptive scheduling

viernes, 27 de septiembre de 13

Scheduling

viernes, 27 de septiembre de 13

C10K

viernes, 27 de septiembre de 13

C100M

viernes, 27 de septiembre de 13

Lightweight processes

viernes, 27 de septiembre de 13

Erlang, Clojure’s core.async, Go

viernes, 27 de septiembre de 13

Lightweight processes: the Holy Grail?

viernes, 27 de septiembre de 13

Dat single Erlang process bottleneck

viernes, 27 de septiembre de 13

Unbounded mailboxes and backpressure

viernes, 27 de septiembre de 13

Race conditions

viernes, 27 de septiembre de 13

Deadlocks in Erlang

viernes, 27 de septiembre de 13

Livelocks in Erlang

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

viernes, 27 de septiembre de 13

Concurrency is about algorithms

viernes, 27 de septiembre de 13

Correctness

viernes, 27 de septiembre de 13

Race conditions are possible with any

language

viernes, 27 de septiembre de 13

Concurrency makes it harder to reason about

correctness

viernes, 27 de septiembre de 13

Most issues arise from shared mutable state

viernes, 27 de septiembre de 13

Solvable?

viernes, 27 de septiembre de 13

Solutions

•Eliminate shared state

viernes, 27 de septiembre de 13

Solutions

•Eliminate shared state

•Use immutable data structures

viernes, 27 de septiembre de 13

«Immutable? But how do I change anything?»

viernes, 27 de septiembre de 13

Immutable data structures create

copies when updated (mutated)

viernes, 27 de septiembre de 13

«But copying is expensive!»

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Value immutability vsreference immutability

viernes, 27 de septiembre de 13

Value immutability: Haskell, Clojure, Erlang.

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Value immutability: libraries for any

language (Ruby, Java, JS)

viernes, 27 de septiembre de 13

Immutability and message passing make reasoning

much easierviernes, 27 de septiembre de 13

Summary

viernes, 27 de septiembre de 13

Concurrency is no longer a nice-to-have

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Concurrency is about

algorithmsviernes, 27 de septiembre de 13

Algorithms are different at every level

viernes, 27 de septiembre de 13

Problems are different at every level

viernes, 27 de septiembre de 13

No substitute for

understandingviernes, 27 de septiembre de 13

Being able to reason about your program

mattersviernes, 27 de septiembre de 13

Immutability and message passing make reasoning

much easierviernes, 27 de septiembre de 13

Not about event loops or Web

Scale™viernes, 27 de septiembre de 13

Concurrency is the new Cloud Computing

viernes, 27 de septiembre de 13

Concurrency is the new Clown Computering

viernes, 27 de septiembre de 13

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

viernes, 27 de septiembre de 13

Be specific or GTFO

viernes, 27 de septiembre de 13

Start learning a language with

immutable data structures today

viernes, 27 de septiembre de 13

clojure-doc.org

viernes, 27 de septiembre de 13

Thank you

viernes, 27 de septiembre de 13

@michaelklishinclojurewerkz.org

viernes, 27 de septiembre de 13

top related