Erlang Web Server Benchmarks
Over the last few weeks I’ve been writing a server side web application framework for Erlang. Essentially, I looked at various available erlang frameworks like WebMachine, Nitrogen, BeepBeep, Yaws, ErlyWeb etc. and pulled out and assembled my own little framework with features I needed. I’ve also been writing an Erlang library for encoding/decoding AMF which will help me add some interesting Flash/Flex specific features to this framework.
Among other things this framework provides web server library specific request/response format abstraction similar to SimpleBridge, A Django templates implementation using ErlyDTL, an MVC implementation inspired from ErlyWeb and a lot more. Even with all this functionality I’m quite happy with the performance we’re able to achieve, so I thought I’d share some benchmarks with everyone.
Since the framework completely abstracts out the web server library used, I was able to try out various web options, but I think we’ll stick with Misultin for our production enviornment since it seems to perform significantly better than other implementations. Here are the results of running AutoBench on our framework powered by Misultin.
The server was running on an m1.large amazon instance running ubuntu and the tests was run from an m1.small amazon instance.
$ autobench --single_host --host1 xyz.com --quiet --low_rate 20 --high_rate 200 --rate_step 20 --num_call 100 -num_conn 5000 --timeout 5 --file results.tsv

Here are some more tests using a different tool Apache Bench
$ ab -k -n 500000 -c 1000 http://xyz.com/
Document Path: /
Document Length: 27 bytes
Concurrency Level: 1000
Time taken for tests: 39.937 seconds
Complete requests: 500000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 500000
Total transferred: 57510350 bytes
HTML transferred: 13502430 bytes
Requests per second: 12519.82 [#/sec] (mean)
Time per request: 79.873 [ms] (mean)
Time per request: 0.080 [ms] (mean, across all concurrent requests)
Transfer rate: 1406.29 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 71.8 0 3005
Processing: 1 78 25.9 77 732
Waiting: 1 78 25.9 77 732
Total: 1 80 79.3 77 3427
Percentage of the requests served within a certain time (ms)
50% 77
66% 87
75% 94
80% 98
90% 110
95% 119
98% 132
99% 144
100% 3427 (longest request)
Running the ab test without the keep alive (-k) option, causes the request rate to fall drastically to around the 3600 r/sec level but looking at the Tornado performance tests here, 3600 seems reasonably good. I haven’t tried adding nginx similar to that Tornado setup, not sure if that would help.





February 24th, 2010
why erlang-web.org is not included? its one of the fastest.
February 25th, 2010
@asdasd
Erlang Web is very nice, but its a framework and not a webserver, it uses Yaws or INETS as the webserver.
I;m writing my own framework for my own needs so I was only comparing performance of webserver modules … YAWS and INETS did not seem to perform as well as Misultin.
Thanks,
Mrinal
November 12th, 2010
Hi Mrinal,
You look pretty cutting edge in terms of Erlang web usage, more sophisticated, cutting edge with real benchmarks to back up your choice of web server with Erlang.
Some questions for you ref your framework:
Can you include Blueprint CSS template system and HAML for templates
Can your framework work with raw SQL for those of us who want to use stored procs
Is your framework ready for prime time use, I have a pretty serious high volume project with a lot of concurrent users. I would love to use Erlang for ease of scaling, but haven’t found a framework that inspires enough confidence yet.
Can you make it easy to output query calls in views, ala Coldfusion which is the most elegant output I’ve ever seen.
example:
SELECT firstname, lastname
FROM Member
LIMIT 30
You can use SEQUEL, Active Record, Datamapper or perhaps even raw sql in your framework.
The output in Coldfusion works like this, its so friggin elegant:
#firstname# #lastname#
In Coldfusion you don’t need a template system, since the tags can fit in anywhere in your html.
Best,
Pardeep.