OSCon - Performance vs Scalability

  • 7,794 views
Uploaded on

Slides for my talk at OSCon 2011 on scalability vs performance, frameworks for non-blocking I/O and message queues.

Slides for my talk at OSCon 2011 on scalability vs performance, frameworks for non-blocking I/O and message queues.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
7,794
On Slideshare
0
From Embeds
0
Number of Embeds
8

Actions

Shares
Downloads
64
Comments
0
Likes
7

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Performance vs Scalability
    • Blocking or non-blocking code, code complexity and architectural blocks to avoid code complexity
  • 2. $whoami
    • work: http://locaweb.com
    • site: http://7co.cc
    • blog: http://zenmachine.wordpress.com
    • code: http://github.com/gleicon
    • RestMQ: http://restmq.com
    • twitter: @gleicon
  • 3. Required Listening “ But your new shoes are worn at the heels and your suntan does rapidly peel and your wise men don't know how it feels to be thick as a brick. ”
  • 4. Objective
    • To discuss how scalability sometimes get confused with performance when speaking about non-blocking I/O
    • To show how most of languages have frameworks to deal with non-blocking I/O
    • Examine an example in different languages and the basic blocks of these frameworks
    • Discuss that this programming model is mandatory, not even migrate from Blocking to non-blocking I/O is needed for most cases. The best solution may not lie in code complexity, but in the right architecture.
    • Discuss a bit about Message Queues, Cache and Redis
  • 5. Basics
      • Asynchronous I/O - Posix aio_*
      • Non-Blocking I/O - Select, Poll, EPoll, Kqueue
      • Reactor - Pattern for multiplexing I/O
      • Future Programming – Generators  and Deferreds
      • Event Emitters 
      • The c10k problem - http://www.kegel.com/c10k.html
  • 6. Scalability, not performance
  • 7. Scalability, not performance
      • Performance: same work with less resources
      • Scalability: more work with added resources
      • Scientific measures for performance: How much and How fast
      • Tricks to improve performance can hurt scalability.
      • Non-Blocking I/O is not an optimization for Performance
      • The time spent waiting for an external resource can be used to other tasks, given a known introduced complexity in the code.
      • Most of time architectural changes can avoid deeper code changes
    • (1,2,3,4 - Goetz et al, Java Concurrency in Practice) 
    • (5,6,7 - Lucindo, R. http://slidesha.re/aYz4Mk, wording on 6 is mine)
  • 8. JAVA concurrency in practice
  • 9. Blocking code example - Download a list of URLs Ruby Python
  • 10. Benchmark
    • Compare blocking and non-blocking Ruby code to download a list of URLs
    • A naive example to examine the effects of both paradigms on the final code
    • The ‘ algorithm ’ to download an URL is (should be) the same in both versions
    • If we had more cores, or more powerful cores, it should not affect the performance of a single download (I/O bound operation)
  • 11. Benchmark - Blocking
  • 12. Benchmark – Blocking + Threads
  • 13. Benchmark - Non-Blocking (Eventmachine based)
  • 14. Benchmark - Results
    • 2 urls
    • Blocking I/O:  0m4.061s
    • Blocking I/O + Threads: 0m2.914s
    • Non-blocking I/O:  0m1.027s
    • 100 urls
    • Blocking I/O:  2m46.769s
    • Blocking I/O + Threads: 0m33.722s
    • Non-blocking I/O:  0m11.495s
  • 15. Python and Twisted
  • 16. Python and Twisted – callback styles Explicit Inline
  • 17. Python and Twisted – Generators Generators
  • 18. Python and Twisted – Deferreds Not Deferreds Deferreds
  • 19. Python and Twisted – Callbacks Callbacks
  • 20. Python and Twisted – Inline callbacks Results from getPage
  • 21. Python and GEvent Monkey patch the socket module
  • 22. Python and GEvent C reate and start greenlets
  • 23. Ruby and EventMachine
  • 24. Ruby and EventMachine - Generators Generator
  • 25. Ruby and EventMachine - Deferreds Sort of deferred
  • 26. Ruby and EventMachine - Callbacks Success and error callbacks
  • 27. Ruby, EventMachine and EM-Synchrony
  • 28. Ruby, EventMachine and EM-Synchrony Inline results
  • 29. Node.js
  • 30. Node.js – Creating and ending the requests Start requests End requests
  • 31. Node.js – Events handlers and callbacks Response event
  • 32. Erlang
  • 33. Erlang – Spawning one download process per url
  • 34. A reminder of what we wanted to do
  • 35. Blocking code example - Download a list of URLs Ruby Python
  • 36. Architectural building blocks
  • 37. M e ssage Queues – decoupling downloads
  • 38. M e ssage Queues – decoupling db writes on a webservice
  • 39. Coupled comments webservice Receive and write to db
  • 40. Message Queue – Comment producer Receive and write to queue, release connection
  • 41. Message Queue – Comment consumer Take from queue and write to db
  • 42. Cache
  • 43. No cache – code from http://github.com/gleicon/vuvuzelr
  • 44. Cache – code from http://github.com/gleicon/vuvuzelr Check if it ’ s on cache Return if it is Feed the cache and set expiration
  • 45. Redis
    • Key/Value store
    • Key is a string, Value can be string, hash, list, set, scored set
    • Atomic operations
    • Publish/Subscription channels
    • Set/Scored Sets operations (union, diff, intersection)
    • UUID Generator, Distributed Cache, Message Queue (RestMQ, Resque), Serialized object storage, throttle control and more at http://rediscookbook.org/
  • 46. Q & A
  • 47. Thanks !