Iteolih: Python Benchmark
24 May 2009 Markus Koetter iteolih python
As the plan is to embedd python as scripting language into the honeypot, I ran a benchmark on a testsuite. The ’testsuite’ is a c core which accepts connections, and allows python to deal with the input. The protocol used for benchmarking is http, the service serves a non static html page.
I tested
-
- 2.6.2_(release26-maint,_Apr_19_2009,_02:15:38)
-
- 3.0.1+_(r301:69556,_Apr_15_2009,_17:22:45)_
-
- 3.1a1+_(py3k,_Mar_30_2009,_02:02:26)_
To benchmark, I ran the apache benchmark tool ab
ab -n 100000 -c 15 http://localhost:8080/bar
The result:
Server Software | 2.6.2 | 3.0.1 | 3.1a |
---|---|---|---|
Server Hostname | localhost | localhost | localhost |
Server Port | 8080 | 8080 | 8080 |
Document Path | /bar | /bar | /bar |
Document Length | 191 bytes | 191 bytes | 191 bytes |
Concurrency Level | 15 | 15 | 15 |
Time taken for tests (seconds) | 28.47 | 102.15 | 31.8 |
Complete requests | 100000 | 100000 | 100000 |
Failed requests | 0 | 0 | 0 |
Write errors | 0 | 0 | 0 |
Total transferred (bytes) | 38600386 | 38200000 | 37600376 |
HTML transferred (bytes) | 19100191 | 19100000 | 19100191 |
Requests per second [#/sec] (mean) | 3512.04 | 978.95 | 3144.45 |
Time per request [ms] (mean) | 4.27 | 15.32 | 4.77 |
Time per request [ms] (mean, across all concurrent requests) | 0.29 | 1.02 | 0.32 |
Transfer rate [Kbytes/sec] received | 1323.89 | 365.19 | 1154.61 |
Python 3.0.1 serves about 978 requests per second, where Python 2.6.2 does 3512 requests/second.
Percentage of the requests served within a certain time (ms) | 2.6.2 | 3.0.1 | 3.1a |
---|---|---|---|
50.00% | 3 | 15 | 4 |
66.00% | 4 | 15 | 5 |
75.00% | 4 | 15 | 5 |
80.00% | 4 | 16 | 5 |
90.00% | 4 | 16 | 5 |
95.00% | 5 | 16 | 5 |
98.00% | 5 | 17 | 6 |
99.00% | 6 | 19 | 6 |
100% (longest request) | 3004 | 3019 | 3006 |
Obviously Python 3.0 does something wrong, talking about factor 4x, it is noticeably slower. But I’m glad to see it is fixed in 3.1 already.
I tried to benchmark using unladen-swallow, the llvm based python project run by google, but was not able to link the code properly. (undefined symbol: _ZTIN4llvm14ModuleProviderE)
As Python 3.1a is almost as fast as 2.6 for our needs, and it can be tricky to port python 2.6 code to 3.x, we will use python 3 as embedded scripting language.