Pylot is a performance tool for benchmarking web services/applications. I am working on exposing some of Pylot's internals so you can use it as a Python Module/API for generating concurrent HTTP load.
Below is a simple function that runs a mini [multi-threaded] load test against a single URL. It will return a dictionary containing runtime statistics. Results and timing information from each request is also logged to a file.
I use something like this to run performance unit tests rapidly (10-30 secs usually). I can bang on the URL for my application and quickly see how it performs and scales.
Here is a small Python script that uses Pylot as a module:
#!/usr/bin/env python import pylot.core.engine as pylot_engine import os import sys import time pylot_engine.GENERATE_RESULTS = False url = 'http://www.pylot.org' num_agents = 5 duration = 10 runtime_stats = {} original_stdout = sys.stdout sys.stdout = open(os.devnull, 'w') req = pylot_engine.Request(url) lm = pylot_engine.LoadManager(num_agents, 0, 0, False, runtime_stats, []) lm.add_req(req) lm.start() time.sleep(duration) lm.stop() sys.stdout = original_stdout for agent_num, stats in runtime_stats.iteritems(): print 'agent %i : %i reqs : avg %.3f secs' % \ (agent_num + 1, stats.count, stats.avg_latency)
Output:
agent 1 : 46 reqs : avg 0.220 secs agent 2 : 46 reqs : avg 0.218 secs agent 3 : 46 reqs : avg 0.220 secs agent 4 : 46 reqs : avg 0.221 secs agent 5 : 46 reqs : avg 0.221 secs
Here is a slightly larger example with some more structure and features. This creates a small command line interface for running a mini load test.
Code:
#!/usr/bin/env python # Corey Goldberg 2009 import pylot.core.engine as pylot_engine import os import sys import time def main(): """ Usage: >python pylot_mini_loadtest.py""" url = sys.argv[1] num_agents = int(sys.argv[2]) duration = int(sys.argv[3]) pylot_engine.GENERATE_RESULTS = False print '\nmini web load test \n---------------------------------' agent_stats = run_loadtest(url, num_agents, duration) throughput = sum([stat.count for stat in agent_stats.values()]) / float(duration) print '%.2f reqs/sec' % throughput for agent_num, stats in agent_stats.iteritems(): print 'agent %i : %i reqs : avg %.3f secs' % \ (agent_num + 1, stats.count, stats.avg_latency) def run_loadtest(url, num_agents, duration): """ Runs a load test and returns a dictionary of statistics from agents. """ original_stdout = sys.stdout sys.stdout = open(os.devnull, 'w') runtime_stats = {} req = pylot_engine.Request(url) lm = pylot_engine.LoadManager(num_agents, 0, 0, False, runtime_stats, []) lm.add_req(req) lm.start() time.sleep(duration) lm.stop() sys.stdout = original_stdout return runtime_stats if __name__ == '__main__': main()
Usage/Output:
C:\test>python pylot_mini_loadtest.py http://www.goldb.org 8 10 mini web load test --------------------------------- 19.20 reqs/sec agent 1 : 24 reqs : avg 0.416 secs agent 2 : 24 reqs : avg 0.418 secs agent 3 : 24 reqs : avg 0.417 secs agent 4 : 24 reqs : avg 0.418 secs agent 5 : 24 reqs : avg 0.415 secs agent 6 : 24 reqs : avg 0.419 secs agent 7 : 24 reqs : avg 0.419 secs agent 8 : 24 reqs : avg 0.419 secs
Of course, for more complex scenarios, you can use the full blown tool, available at: www.pylot.org/download.html
Questions? Hit me up.
2 comments:
I've seen you initiated http://code.google.com/p/pyloadtools/
Is it still alive or should I stick to Pylot?
Erny,
I never got around to finishing up the pyloadtools thing and have sorta taken a break with Pylot.
For my latest in python web performance tools, check out Multi-Mechanize:
http://code.google.com/p/multi-mechanize/
Post a Comment