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