RkBlog

Hardware, programming and astronomy tutorials and reviews.

Simple Python Frameworks Benchmark

This page contains various test and benchmarks of django, pylons and possibly other frameworks. Those tests shouldn't be trusted in 100%.

Django server httperf test

I've tested how much load the django server can stand without any errors.
Hardware/Software: Arch Linux (i686) on Acer Aspire 5002 WLMi Laptop (AMD Turion 1,6GHz, 512MB DDR RAM) XFS partition. A laptop isn't your Mainframe server ;)
Test conditions: Text mode (no X running, about 16MB of RAM used)
Httperf config:
httperf --server=localhost --port=8080 --uri=/test/ --num-conns=40000 --num-calls=1 --rate=X --timeout=4
where X is numer of connection per second.
Django output: a page which uses a template with 5 variables (one a big string) whole page has 15KB of size. No database is used. Django SVN 0.95 (2006.07.15)

RESULTS

Errors:
- No errors for 100 - 400 connections/s
- 500 conns/s : 24441 errors
- 600: 31758 errors
- 700: 34804 errors

Average connection time (ms):
100: 5
200: 1,8
300: 1,9
400: 1,9
500: 227,3
600: 350,5
700: 513,8

Gentoo AMD 64 system, the same hardware
Errors:
- No errors for 100 - 400 connections/s
- 500 conns/s : 80 errors
- 600: 27069 errors

Average connection time (ms):
200: 7,1
400: 1,9
500: 20,2
600: 482,2

CPU usage by "python" process from "top" (%)
200: 40
400: 75
500: 95
600: goes crazy, 0%
"free -m" returns 30MB of RAM used by the whole system. "top" returns always 3% of RAM used by "python"

The errors

I see:
Traceback (most recent call last):
  File "/home/piotr/nowe/python/django_src/django/core/servers/basehttp.py", line 273, in run
    self.finish_response()
  File "/home/piotr/nowe/python/django_src/django/core/servers/basehttp.py", line 312, in finish_response
    self.write(data)
  File "/home/piotr/nowe/python/django_src/django/core/servers/basehttp.py", line 391, in write
    self.send_headers()
  File "/home/piotr/nowe/python/django_src/django/core/servers/basehttp.py", line 443, in send_headers
    self.send_preamble()
  File "/home/piotr/nowe/python/django_src/django/core/servers/basehttp.py", line 372, in send_preamble
    self._write(
  File "/usr/lib/python2.4/socket.py", line 256, in write
    self.flush()
  File "/usr/lib/python2.4/socket.py", line 243, in flush
    self._sock.sendall(buffer)
error: (32, 'Broken pipe')
When an error ocurs.


Pylons server (paster?) httperf test

The test was the same as for django above, the test page returned a myghty template with 5 variables from the controller (the same values) and so on. I've used SVN pylons and it dependencies (0.9, 2006.07.16) Tested on Archlinux.
development.ini: debug=false
Httperf config:
httperf --server=localhost --port=5000 --uri=/hello/test/ --num-conns=40000 --num-calls=1 --rate=150 --timeout=4

RESULTS

Errors:
- 100: 0
- 200: 30856
- 300: 33902
- 400: 35555
- 500: 35568

Average connection time (ms):
- 100: 3.9
- 200: 822.3
- 300: 804.6
- 400: 1225.4
- 500: 1169.7
"top" says that "paster" uses about 14% of CPU and about 3% of RAM

Turbogears/cherrypy httperf test

I've used a svn version (20.07.2006) of turbogears. I've edited the welcome template and controller so it shows the same data. PS. kid templates with "valid xml" is a big shit... annoying little bastard.

RESULTS

Errors:
- 100: 0
- 200: 37488
- 300: 34381
Average connection time (ms):
- 100: 10.1
- 200: 1948.5 changs
- 300: 3869.5 changs
RkBlog

Web development, 14 July 2008, Piotr Maliński

Comment article