50 shades of concurrency

485 views

Published on

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

Published in: Technology
  • Be the first to comment

50 shades of concurrency

  1. 1. 50 Shades of Concurrency viernes, 27 de septiembre de 13
  2. 2. About me viernes, 27 de septiembre de 13
  3. 3. About me @michaelklishin viernes, 27 de septiembre de 13
  4. 4. About me viernes, 27 de septiembre de 13
  5. 5. About me clojurewerkz.org viernes, 27 de septiembre de 13
  6. 6. About me Ex-Travis CI core viernes, 27 de septiembre de 13
  7. 7. About me viernes, 27 de septiembre de 13
  8. 8. About me data processing and analytics viernes, 27 de septiembre de 13
  9. 9. About me dozen of programming languages, <3 ƛ viernes, 27 de septiembre de 13
  10. 10. About me recognized animated gifs expert viernes, 27 de septiembre de 13
  11. 11. About this talk viernes, 27 de septiembre de 13
  12. 12. About this talk N lightning talks combined viernes, 27 de septiembre de 13
  13. 13. About this talk Multiple related topics viernes, 27 de septiembre de 13
  14. 14. About this talk Observations viernes, 27 de septiembre de 13
  15. 15. About this talk Rants viernes, 27 de septiembre de 13
  16. 16. viernes, 27 de septiembre de 13
  17. 17. Do we really need concurrency? viernes, 27 de septiembre de 13
  18. 18. viernes, 27 de septiembre de 13
  19. 19. The shit is just too damn hard viernes, 27 de septiembre de 13
  20. 20. viernes, 27 de septiembre de 13
  21. 21. Do we need concurrency? viernes, 27 de septiembre de 13
  22. 22. «In 2013 alone, IP traffic is expected to grow by around 14 exabytes per month…» — ITU viernes, 27 de septiembre de 13
  23. 23. Exabyte? LOLWUT? viernes, 27 de septiembre de 13
  24. 24. Exabyte • 10^18 bytes viernes, 27 de septiembre de 13
  25. 25. Exabyte • 10^18 bytes • 1,000 petabytes viernes, 27 de septiembre de 13
  26. 26. Exabyte • 10^18 bytes • 1,000 petabytes • 1,000,000,000 gigabytes viernes, 27 de septiembre de 13
  27. 27. viernes, 27 de septiembre de 13
  28. 28. viernes, 27 de septiembre de 13
  29. 29. If your project is data- driven, concurrency is no longer a nice-to-have viernes, 27 de septiembre de 13
  30. 30. Do we need concurrency? viernes, 27 de septiembre de 13
  31. 31. viernes, 27 de septiembre de 13
  32. 32. Timely updates from N sources is a UI feature viernes, 27 de septiembre de 13
  33. 33. Products compete on user experience viernes, 27 de septiembre de 13
  34. 34. Reasonably responsive UI or GTFO viernes, 27 de septiembre de 13
  35. 35. Do we need concurrency? viernes, 27 de septiembre de 13
  36. 36. The world around us is concurrent viernes, 27 de septiembre de 13
  37. 37. Pull iPhone headphones jack when the track is being switched viernes, 27 de septiembre de 13
  38. 38. Why it happens? viernes, 27 de septiembre de 13
  39. 39. Race condition viernes, 27 de septiembre de 13
  40. 40. Race conditions, explained viernes, 27 de septiembre de 13
  41. 41. Do we need concurrency? viernes, 27 de septiembre de 13
  42. 42. Do we need to understand concurrency? viernes, 27 de septiembre de 13
  43. 43. «my framework will solve this problem for me!» viernes, 27 de septiembre de 13
  44. 44. viernes, 27 de septiembre de 13
  45. 45. require "mutex" m = Mutex.new m.synchronize do m.synchronize do # ... end end viernes, 27 de septiembre de 13
  46. 46. viernes, 27 de septiembre de 13
  47. 47. 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
  48. 48. viernes, 27 de septiembre de 13
  49. 49. viernes, 27 de septiembre de 13
  50. 50. «Deadlock describes a situation when one or more threads are blocked waiting on each other…» viernes, 27 de septiembre de 13
  51. 51. require "mutex" m = Mutex.new m.synchronize do m.synchronize do # ... end end viernes, 27 de septiembre de 13
  52. 52. Unfortunately, Ruby standard library has more poor design decisions w.r.t. concurrency viernes, 27 de septiembre de 13
  53. 53. Solvable? viernes, 27 de septiembre de 13
  54. 54. require “monitor” viernes, 27 de septiembre de 13
  55. 55. 5-10% throughput decrease viernes, 27 de septiembre de 13
  56. 56. Backwards compatiblity viernes, 27 de septiembre de 13
  57. 57. viernes, 27 de septiembre de 13
  58. 58. Mutexes, explained viernes, 27 de septiembre de 13
  59. 59. Mutexes, explained viernes, 27 de septiembre de 13
  60. 60. «I know, Java is incredibly solid and stable!» viernes, 27 de septiembre de 13
  61. 61. Map<String, Integer> m = new HashMap<>(); m.put("michael", 3); viernes, 27 de septiembre de 13
  62. 62. results in… viernes, 27 de septiembre de 13
  63. 63. CPU usage spikes viernes, 27 de septiembre de 13
  64. 64. HashMap can create infinite loops internally if you write to it concurrently, and a write causes a resize. viernes, 27 de septiembre de 13
  65. 65. When I find myself in times of trouble Prof. Doug Lea comes to me Coding lines of wisdom j.u.c. viernes, 27 de septiembre de 13
  66. 66. java.util.concurrent viernes, 27 de septiembre de 13
  67. 67. «MyVM will solve the problem for me!» viernes, 27 de septiembre de 13
  68. 68. Very GC/allocations heavy algorithm implemented in Clojure viernes, 27 de septiembre de 13
  69. 69. «abysmal multicore performance, especially on AMD processors…» https://groups.google.com/d/topic/clojure/48W2eff3caU/discussion viernes, 27 de septiembre de 13
  70. 70. ~100 replies and 20 participants later… viernes, 27 de septiembre de 13
  71. 71. The bottleneck is… viernes, 27 de septiembre de 13
  72. 72. OpenJDK/Oracle JDK memory allocator viernes, 27 de septiembre de 13
  73. 73. LOLWUT? viernes, 27 de septiembre de 13
  74. 74. «It’s C++ and a few billions of $ worth of engineering man-hours!» viernes, 27 de septiembre de 13
  75. 75. Not every algorithm has concurrent alternatives viernes, 27 de septiembre de 13
  76. 76. Efficient, concurrent writes is a hard problem viernes, 27 de septiembre de 13
  77. 77. Lock contention viernes, 27 de septiembre de 13
  78. 78. Lock contention, exlained viernes, 27 de septiembre de 13
  79. 79. Lock contention, exlained viernes, 27 de septiembre de 13
  80. 80. Memory models viernes, 27 de septiembre de 13
  81. 81. «My compiler will solve the problem for me!» viernes, 27 de septiembre de 13
  82. 82. Compilers are very sophisticated tools and can do a lot for you. But they still need your help from time to time. viernes, 27 de septiembre de 13
  83. 83. False sharing viernes, 27 de septiembre de 13
  84. 84. viernes, 27 de septiembre de 13
  85. 85. viernes, 27 de septiembre de 13
  86. 86. False sharing viernes, 27 de septiembre de 13
  87. 87. class Metrics attr_accessor :signin_requests attr_accessor :signout_requests end viernes, 27 de septiembre de 13
  88. 88. Thread A updates :signin_requests viernes, 27 de septiembre de 13
  89. 89. Thread B updates :signout_requests viernes, 27 de septiembre de 13
  90. 90. CPU caches viernes, 27 de septiembre de 13
  91. 91. viernes, 27 de septiembre de 13
  92. 92. Memory is stored in CPU caches in chunks viernes, 27 de septiembre de 13
  93. 93. The chunks are known as cache lines viernes, 27 de septiembre de 13
  94. 94. viernes, 27 de septiembre de 13
  95. 95. Cache line viernes, 27 de septiembre de 13
  96. 96. Cache line Thread A updates viernes, 27 de septiembre de 13
  97. 97. Cache line Thread B updates viernes, 27 de septiembre de 13
  98. 98. Cache line RAM viernes, 27 de septiembre de 13
  99. 99. Threads update independent variables, but the entire cache line is has to be read from RAM viernes, 27 de septiembre de 13
  100. 100. Solvable? viernes, 27 de septiembre de 13
  101. 101. public final class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; } viernes, 27 de septiembre de 13
  102. 102. viernes, 27 de septiembre de 13
  103. 103. «Threads suck! UNIX processes will solve my problem!» viernes, 27 de septiembre de 13
  104. 104. fork(2) viernes, 27 de septiembre de 13
  105. 105. fork(2) vs forkall(2) viernes, 27 de septiembre de 13
  106. 106. fork(2) and parent process that holds mutex(es) viernes, 27 de septiembre de 13
  107. 107. async signal safe viernes, 27 de septiembre de 13
  108. 108. «The child inherits copies of the parent's set of open file descriptors…» viernes, 27 de septiembre de 13
  109. 109. «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
  110. 110. man 2 fork, CAVEATS viernes, 27 de septiembre de 13
  111. 111. man 2 vfork viernes, 27 de septiembre de 13
  112. 112. Process race conditions viernes, 27 de septiembre de 13
  113. 113. Not that many concurrency libraries for processes viernes, 27 de septiembre de 13
  114. 114. «My OS will solve the problem for me!» viernes, 27 de septiembre de 13
  115. 115. viernes, 27 de septiembre de 13
  116. 116. viernes, 27 de septiembre de 13
  117. 117. Cooperative concurrency, explained viernes, 27 de septiembre de 13
  118. 118. Cooperative concurrency, explained viernes, 27 de septiembre de 13
  119. 119. Preemptive scheduling viernes, 27 de septiembre de 13
  120. 120. Scheduling viernes, 27 de septiembre de 13
  121. 121. C10K viernes, 27 de septiembre de 13
  122. 122. C100M viernes, 27 de septiembre de 13
  123. 123. Lightweight processes viernes, 27 de septiembre de 13
  124. 124. Erlang, Clojure’s core.async, Go viernes, 27 de septiembre de 13
  125. 125. Lightweight processes: the Holy Grail? viernes, 27 de septiembre de 13
  126. 126. Dat single Erlang process bottleneck viernes, 27 de septiembre de 13
  127. 127. Unbounded mailboxes and backpressure viernes, 27 de septiembre de 13
  128. 128. Race conditions viernes, 27 de septiembre de 13
  129. 129. Deadlocks in Erlang viernes, 27 de septiembre de 13
  130. 130. Livelocks in Erlang viernes, 27 de septiembre de 13
  131. 131. viernes, 27 de septiembre de 13
  132. 132. viernes, 27 de septiembre de 13
  133. 133. Concurrency is about algorithms viernes, 27 de septiembre de 13
  134. 134. Correctness viernes, 27 de septiembre de 13
  135. 135. Race conditions are possible with any language viernes, 27 de septiembre de 13
  136. 136. Concurrency makes it harder to reason about correctness viernes, 27 de septiembre de 13
  137. 137. Most issues arise from shared mutable state viernes, 27 de septiembre de 13
  138. 138. Solvable? viernes, 27 de septiembre de 13
  139. 139. Solutions •Eliminate shared state viernes, 27 de septiembre de 13
  140. 140. Solutions •Eliminate shared state •Use immutable data structures viernes, 27 de septiembre de 13
  141. 141. «Immutable? But how do I change anything?» viernes, 27 de septiembre de 13
  142. 142. Immutable data structures create copies when updated (mutated) viernes, 27 de septiembre de 13
  143. 143. «But copying is expensive!» viernes, 27 de septiembre de 13
  144. 144. Copying doesn’t have to be a naïve “full copy” viernes, 27 de septiembre de 13
  145. 145. Value immutability vs reference immutability viernes, 27 de septiembre de 13
  146. 146. Value immutability: Haskell, Clojure, Erlang. viernes, 27 de septiembre de 13
  147. 147. Reference immutability: C++, Java, Scala, Rust. viernes, 27 de septiembre de 13
  148. 148. Value immutability: libraries for any language (Ruby, Java, JS) viernes, 27 de septiembre de 13
  149. 149. Immutability and message passing make reasoning much easier viernes, 27 de septiembre de 13
  150. 150. Summary viernes, 27 de septiembre de 13
  151. 151. Concurrency is no longer a nice-to-have viernes, 27 de septiembre de 13
  152. 152. There is no such thing as a “thread safe framework” viernes, 27 de septiembre de 13
  153. 153. Concurrency is about algorithms viernes, 27 de septiembre de 13
  154. 154. Algorithms are different at every level viernes, 27 de septiembre de 13
  155. 155. Problems are different at every level viernes, 27 de septiembre de 13
  156. 156. No substitute for understanding viernes, 27 de septiembre de 13
  157. 157. Being able to reason about your program matters viernes, 27 de septiembre de 13
  158. 158. Immutability and message passing make reasoning much easier viernes, 27 de septiembre de 13
  159. 159. Not about event loops or Web Scale™ viernes, 27 de septiembre de 13
  160. 160. Concurrency is the new Cloud Computing viernes, 27 de septiembre de 13
  161. 161. Concurrency is the new Clown Computering viernes, 27 de septiembre de 13
  162. 162. «Blah blah, X blowsY out of the water in concurrency…» viernes, 27 de septiembre de 13
  163. 163. Be specific or GTFO viernes, 27 de septiembre de 13
  164. 164. Start learning a language with immutable data structures today viernes, 27 de septiembre de 13
  165. 165. clojure-doc.org viernes, 27 de septiembre de 13
  166. 166. Thank you viernes, 27 de septiembre de 13
  167. 167. @michaelklishin clojurewerkz.org viernes, 27 de septiembre de 13

×