Month: October 2009
Python 3.1 and mod_wsgi performance notes
We’re researching the use of Python and mod_wsgi running under apache for developing some extensive web applications. Here are some notes on a performance test that we recently ran.
==================================================================
Server:
x86_64
Python 3.1.1
mod_wsgi 3.0c5
apache 2.2
RHEL 5.3
quad core xenon
8 GB ram
Development system – not in production use.
==================================================================
Application:
1 import time
2
3 def application(environ, start_response):
4 status = ‘200 OK’
5
6 output = “hello world!”
7
8 #time.sleep(1)
9
10 response_headers = [
11 (‘Content-type’, ‘text/plain’),
12 (‘Content-Length’, str(len(output))),
13 ]
14
15 start_response(status, response_headers)
16
17 return [output]
==================================================================
Apache Configuration:
WSGISocketPrefix run/wsgi
<VirtualHost *>
ServerName shankproject.jason.star.ionzoft.net
DocumentRoot /home/jason/Code/ShankProject/Web
WSGIScriptAlias /Admin /home/jason/Code/ShankProject/WSGI/
Admin.wsgi
WSGIDaemonProcess shankproject.jason.star.ionzoft.net threads=15
WSGIProcessGroup shankproject.jason.star.ionzoft.net
</VirtualHost>
==================================================================
Tests:
—————————————————–
# Baseline with one process and 15 threads
# 15 threads total
threads=15
no process definition
WITHOUT time.sleep(1)
concurrency = 1 >> 1800 / second
concurrency = 100 >> 3900 / second
WITH time.sleep(1)
concurrency = 1 >> 1 / second
concurrency = 100 >> 14 / second
—————————————————–
# Get a marginal improvement by doubling the threads to 30
# 30 threads total
threads=30
no process definition
WITHOUT time.sleep(1)
concurrency = 1 >> 1680 / second
concurrency = 100 >> 3500 / second
WITH time.sleep(1)
concurrency = 1 >> 1 / second
concurrency = 100 >> 30 / second
—————————————————–
# Take processes from 1 to 3
# 90 threads total
threads=30
processes=3
WITHOUT time.sleep(1)
concurrency = 1 >> 1770 / second
concurrency = 100 >> 3500 / second
WITH time.sleep(1)
concurrency = 1 >> 1 / second
concurrency = 100 >> 88 / second
—————————————————–
# Take processes from 3 to 6
# Take threads from 30 to 15
# 90 threads total
threads=30
processes=3
WITHOUT time.sleep(1)
concurrency = 1 >> 1550 / second
concurrency = 100 >> 3300 / second
WITH time.sleep(1)
concurrency = 1 >> 1 / second
concurrency = 100 >> 88 / second
==================================================================
Conclusion:
mod_wsgi performance is outstanding. Even running slower requests, it
can still handle significant concurrency in daemon mode without any
apparent issues.
Questions:
Is there any information on the balance between more processes less
threads and more threads less processes?
Thanks!