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