Scaling real world applications using gevent
Upcoming SlideShare
Loading in...5
×
 

Scaling real world applications using gevent

on

  • 2,640 views

Talk at Pycon India 2012 by Aalok the Magnificent

Talk at Pycon India 2012 by Aalok the Magnificent

Statistics

Views

Total Views
2,640
Views on SlideShare
2,376
Embed Views
264

Actions

Likes
6
Downloads
53
Comments
1

1 Embed 264

http://in.pycon.org 264

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • You can share the source code?
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Scaling real world applications using gevent Scaling real world applications using gevent Presentation Transcript

  • Concurrency & GeventScaling Real World Applications
  • Concurrencyhandling a number of things at the same timeExamples: (Incoming) WebServers, Database Servers (Outgoing) SSH Mux
  • SSH Mux● Execute a command on a remote SSH server● Handle concurrent SSH Clients● Command execution time varies from seconds to days● Command execution happens on remote servers, SSH mux is I/O bound
  • SSH Client1. Init session2. Authenticate3. Get a channel4. Issue command5. Read output
  • Need Concurrency?● Process blocks on read()● No new connections can be inititated● Need ability to handle multiple clients at the same time
  • Multiprocessing● One process is the master● Master can spawn workers● Each worker handles one request at a time● Pre-forked pool of workers
  • Concurrent SSH Clients
  • SSH Mux Memory Usage ssh mux memory usage 600 500 400 Memory (MB) 300 Processes 200 100 0 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 # Concurrent Reqs
  • SSH Mux Performace ssh mux performance sheet 160 140 120 100Time(s) 80 Processes 60 40 20 0 20 40 80 150 200 400 800 1200 1500 1800 2100 # Concurrent Reqs
  • Multiprocessing yay● Easy to get started● OS guaranteed process isolation & fairness● Covers up for misbehaving workers● Add more concurrency by adding more workers● Convenient when numbers are smaller numbers
  • Multiprocessing nay● Concurrency limited by number of processes● Memory heavy● Implicit scheduling● Synchronization is not trivial
  • More Concurrency?● Command execution is happening on remote servers, we are mostly blocked on I/O● Handle multiple I/O in a single process?
  • Geventgevent is a coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libevent event loop.
  • Greenlets● Lightweight threads - not OS threads● Explicit scheduling - Cooperative● Minimal stack● Application decides execution flow● Easy to synchronize/ Avoid locks● All run inside one process
  • Libevent● Use fastest mechanism to poll (portable)● Fast Event loop● In Gevent, event loop runs in a greenlet (event hub)● Instead of blocking, greenlets switch to event hub● Its all done behind the scene
  • Monkey PatchingMonkey patchingModifies behaviour of blocking calls such as select, sleep tonon-blockingPatches the python standard socket library
  • Gevent● Greenlet 1 is running● Greenlet 2 and 3 are ready
  • Gevent● Greenlet 1 has to wait for read● Greenlet 1 switches to Event hub
  • Gevent● Event hub switches to Greenlet 3
  • Gevent● Greenlet 2 runs
  • Gevent● Greenlet 2 wants to sleep● Greenlet 2 switches to Event hub
  • Gevent● Greenlet 1 data has come, moved to ready state● Eventhub switches to Greenlet 3
  • Gevent● Greenlet 3 runs
  • Gevent● When Greenlet 1 resumes, its from next instruction● Its as if it were a blocking call
  • Green SSH Client1. Init session2. Authenticate3. Get a channel4. Issue command5. Read output
  • A closer look
  • Going Concurrent Use pre-forked processes to use all cores
  • Memory usage ssh mux memory usage 45 40 35 30Memory(MB) 25 Gevent+Processes 20 15 10 5 0 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 # Concurrent Reqs
  • SSH Mux Performace ssh mux performace chart 70 60 50 40 Time(s) Gevent+Processes 30 20 10 0 20 40 80 150 200 400 800 1200 1500 1800 2100 # Concurrent Reqs
  • SSH Mux memory usage ssh mux memory usage 600 500 400 Memory(MB) Processes 300 Gevent 200 100 0 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 # Concurrent Reqs
  • SSH Mux Performance ssh mux performance sheet 160 140 120 100 ProcessesTime(s) 80 Gevent+Processes 60 40 20 0 20 40 80 150 200 400 800 1200 1500 1800 2100 # Concurrent Reqs
  • Gevent yay!● Untwist – write linear non blocking code● Explicit scheduling, dictate the execution flow● Timeouts● Events, AsyncResults for Synchronization● gevent.wsgi● Pre-spawned pool of greenlets
  • Gevent beware of● No multicore support● Not great for CPU bound applications● Third party libs must be green (non blocking)● Misbehaving workers can be lethal● No fairness when it comes to scheduling
  • Take Away● Gevent lets you write asynchronous code in a synchronous manner● No multicore support, still need multiprocessing● Not so great for CPU bound applications● Split your application into CPU bound and IO bound parts● Be willing to contribute patches● Code available at git@github.com:aaloksood/pyexamples.git
  • Thank you Thats all folks!
  • Countdown Timer● Count down from 200000000● Split work among workers
  • Threads Multithreading wonder 25 20 15 1 Core Time(s) 4 cores 10 5 0 1 2 3 4 5 6 7 8 9 10 # Workers
  • One core Execution time One Core 14.5 14 13.5 13 Processes 1 Core Time (s) 12.5 Gevent_1 12 Gevent_4 11.5 11 10.5 1 2 3 4 5 6 7 8 9 10 # Workers
  • Four cores Execution time 4 cores 25 20 Process 15 Threads Time(s) Gevent_1 10 Gevent_4 5 0 1 2 3 4 5 6 7 8 9 10 # Workers