$30 off During Our Annual Pro Sale. View Details »

High Performance Ruby: Threading versus Evented (Ruby MidWest edition)

High Performance Ruby: Threading versus Evented (Ruby MidWest edition)

I wanted to know, "Do I need to learn about EventMachine or node.js? Can I use threads? What is so good or bad about threading in Ruby 1.8, Ruby 1.9, JRuby and Rubinius 2.0?"
What was important to me was the the choice was abstracted away. I wanted to write normal, step-by-step Ruby code. Yet I wanted it to be performant.
I've asked a lot of people. I even hosted EM RubyConf (http://emrubyconf.com) during RailsConf 2011 in order to gather the brightest minds in the Ruby community.
"What choices do I need to make, how different does my code look, and how do I do testing?" These are the questions I searched for answers.
I'd like to now share the answers.

Dr Nic Williams

November 05, 2011
Tweet

More Decks by Dr Nic Williams

Other Decks in Technology

Transcript

  1. High-Performance Ruby:
    Evented vs readed
    @drnic | drnicwilliams.com | engineyard.com
    Dr Nic Williams

    View Slide

  2. “ruby
    midwest”

    View Slide

  3. “ruby
    midwest”

    View Slide

  4. midwest

    View Slide

  5. midwest

    View Slide

  6. kansas

    View Slide

  7. kansas city

    View Slide

  8. in Missouri

    View Slide

  9. midwest?!

    View Slide

  10. an actual
    safari

    View Slide

  11.  ________  
    <  Safari  >
     -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  
                   \      ^__^
                     \    (xx)\_______
                           (__)\              )\/\
                             ^    ||-­‐-­‐-­‐-­‐w  |
                                   ||          ||

    View Slide

  12. drnic
    cowsay

    View Slide

  13. View Slide

  14. You have $

    View Slide

  15. New project/rapid dev
    Optimise
    (features/$)
    (req latency/$)
    (req thru-put/$)
    (bugs/$)

    View Slide

  16. Add resources

    View Slide

  17. Resources = $
    $

    View Slide

  18. or even $$$$$
    $
    $
    $
    $ $

    View Slide

  19. Optimise
    New project/rapid dev
    (features/$)
    (performance/$0)
    how?

    View Slide

  20. View Slide

  21. •Add resources
    •Use resources better
    Options

    View Slide

  22. you?
    just write
    code

    View Slide

  23. evented
    -> threads
    -> your code

    View Slide

  24. nginx
    -> trinidad
    -> web app

    View Slide

  25. evented?
    arrange
    I/O

    View Slide

  26. threads?
    actual
    work

    View Slide

  27. you?
    just write
    code

    View Slide

  28. evented
    -> threads
    -> your code

    View Slide

  29. nginx
    -> trinidad
    -> web app

    View Slide

  30. •Add resources
    •Use resources better
    Options

    View Slide

  31. •process concurrency
    •threaded concurrency
    •evented concurrency
    Concurrency

    View Slide

  32. Process
    vs
    readed

    View Slide

  33. •1 req = 1 process = 150Mb
    •“100 reqs?” = 15Gb!
    •Orchestrated by? Kernel
    •Unicorn, Passenger
    Process
    Concurrency

    View Slide

  34. •1 req = 1 thread = 2kb
    •“100 reqs?”=150Mb+200kb
    •Orchestrated by? Kernel
    •Mongrel*
    readed
    Concurrency

    View Slide

  35. 1 req =
    1 thread =
    2kb

    View Slide

  36. Process
    vs
    readed

    View Slide

  37. evented
    -> threads
    -> your code

    View Slide

  38. View Slide

  39. •....
    •....
    •....
    •Mongrel*
    readed
    Concurrency

    View Slide

  40. •....
    •....
    •....
    •Mongrel*
    readed
    Concurrency

    View Slide

  41. “Mongrel is
    threaded?!”

    View Slide

  42. View Slide

  43. Mongrel * Rails *
    Ruby1.8 -->
    process conc.
    2006 reality:

    View Slide

  44. 20068 reality:
    “Rails 2.2...
    rst...thread
    safe Rails”
    --Pratik Naik

    View Slide

  45. 20068 reality:
    config.threadsafe!
    http://guides.rubyonrails.org/configuring.html

    View Slide

  46. 20068 reality:
    # do nothing
    http://www.sinatrarb.com/configuration.html

    View Slide

  47. Mongrel * Rails *
    Ruby1.8 -->
    process conc.
    20068 reality:

    View Slide

  48. 200810 reality:
    “Ruby 1.9.2 is
    released”

    View Slide

  49. 200810 reality:
    1.9 has native
    threads!

    View Slide

  50. 200810 reality:
    1 thread of
    Ruby at a
    time :(

    View Slide

  51. 200810 reality:
    GIL = Global
    Interpreter
    Lock :(

    View Slide

  52. 200810 reality:
    GIL:(
    “Grumpy Gil”

    View Slide

  53. Mongrel * Rails *
    Ruby1.9 -->
    process conc.
    200810 reality:

    View Slide

  54. “Mongrel is
    threaded?!”
    “Rails is
    threadsafe”
    but no threads...

    View Slide

  55. View Slide

  56. “reads
    please!”

    View Slide

  57. rvm install jruby
    rvm use jruby
    gem install rails
    rails new myapp

    View Slide

  58. gem 'activerecord-
    jdbcsqlite3-
    adapter'
    gem 'jruby-openssl'

    View Slide

  59. Mongrel * Rails *
    JRuby -->
    thread
    concurrency!

    View Slide

  60. 1 req =
    1 thread =
    2kb

    View Slide

  61. “How do I
    run JRuby/
    Rails?”

    View Slide

  62. How?
    -> trinidad
    -> web app

    View Slide

  63. $ gem install trinidad
    $ trinidad
    --> localhost:3000

    View Slide

  64. $ git clone git://
    github.com/
    engineyard/todo.git
    $ cd todo
    $ bundle
    $ rake db:migrate
    $ trinidad

    View Slide

  65. # config.threadsafe!
    $ trinidad
    Info: max runtimes = 5

    View Slide

  66. config.threadsafe! # yes!
    $ trinidad -e production
    Info: max runtimes = 1
    (Thread limit 200)

    View Slide

  67. 1 req =
    1 thread =
    2kb

    View Slide

  68. And its just
    normal web
    app code!

    View Slide

  69. evented
    -> threads
    -> your code

    View Slide

  70. nginx
    -> trinidad
    -> web app

    View Slide

  71. “I’m scared
    of threads”

    View Slide

  72. Web apps
    are*
    thread safe

    View Slide

  73. “Store state elsewhere;
    Unless its safe”
    Dr Nic’s Joy of
    Concurrency

    View Slide

  74. View Slide

  75. evented
    -> threads
    -> your code

    View Slide

  76. nginx
    -> trinidad
    -> web app

    View Slide

  77. “I came to hear
    good things
    about
    EventMachine”

    View Slide

  78. “Evented is cool,
    threads are not”

    View Slide

  79. “You haven’t
    said ‘nodejs’
    once!?”

    View Slide

  80. What is
    evented?
    any
    I/O?
    do something
    with it

    View Slide

  81. cache
    hits
    req ?
    web
    app
    cache
    miss

    View Slide

  82. cache
    hits
    req ?
    web
    app
    cache
    miss

    View Slide

  83. req I/O work

    View Slide

  84. req I/O work
    evented threads

    View Slide

  85. req I/O work
    evented threads
    trinidad
    nginx

    View Slide

  86. nginx
    vs apache

    View Slide

  87. “Hosted?”
    500 hrs free!

    View Slide

  88. jruby core
    trinidad core
    rubinius core
    Come work
    with us!

    View Slide

  89. -> your code
    “Be a happy
    developer”

    View Slide

  90. -> threads
    -> your code

    View Slide

  91. evented
    -> threads
    -> your code

    View Slide

  92. nginx
    -> trinidad
    -> web app
    @drnic | drnicwilliams.com | engineyard.com

    View Slide

  93.  _____________  
    <  Power  Ruby!  >
     -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  
                   \      ^__^
                     \    (Oo)\_______
                           (__)\              )\/\
                             <>  ||-­‐-­‐-­‐-­‐w  |
                                   ||          ||
    @drnic | drnicwilliams.com | engineyard.com

    View Slide