Hi, everyone. Long time (occasional) reader, first time writer here.

In the 5.x days I played with Racket's Web servlets and found them slower than 
I'd expected. (My exceptions were, admittedly, quite high after seeing how much 
better Racket performed at other tasks than your average scripting language.) 
I've decided to try Web servlets out again, but this time to put some rough 
numbers on the performance with a reproducible benchmark.

My benchmark compares Racket's stateful and stateless servlets against the SCGI 
package for Racket, Caddy (HTTP server written in Go), Flask (Python web 
microframework), GNU Guile's Web server module, Ring/Compojure (Clojure HTTP 
middleware/routing library), Plug (Elixir HTTP middleware), and Sinatra (Ruby 
web microframework). On each of these platforms the benchmark implements a 
trivial web application that serves around 4K of plain text. It uses 
ApacheBench to stress it with a configurable number of concurrent connections. 
The application and ApacheBench are run in separate Docker containers, which 
lets you tune the memory and the CPU time available to them. I've published the 
source code for the benchmark at 
https://gitlab.com/dbohdan/racket-vs-the-world/. It should be straightforward 
to run on Linux with Docker (but please report any difficulties!).

I've attached the results I got on a two-core VM. According to them, Racket's 
servlets do lag behind everything else but Sinatra. The results are for 100 
concurrent connections, which is the default, but the differences in throughput 
are still very similar with 20 connections and quite similar with just one. I'd 
appreciate any feedback on these results (do they look reasonable to you?) and 
the code behind the benchmark (did I miss any crucial bits of configuration for 
the servlet?).

Best,
D. Bohdan

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
> grep -A 21 'Requests per second' results/*
results/caddy.txt:Requests per second:    4294.27 [#/sec] (mean)
results/caddy.txt-Time per request:       23.287 [ms] (mean)
results/caddy.txt-Time per request:       0.233 [ms] (mean, across all 
concurrent requests)
results/caddy.txt-Transfer rate:          18141.66 [Kbytes/sec] received
results/caddy.txt-
results/caddy.txt-Connection Times (ms)
results/caddy.txt-              min  mean[+/-sd] median   max
results/caddy.txt-Connect:        0    1   0.9      0      12
results/caddy.txt-Processing:     0   23  11.2     21     106
results/caddy.txt-Waiting:        0   21  10.7     20     102
results/caddy.txt-Total:          0   23  11.0     22     106
results/caddy.txt-WARNING: The median and mean for the initial connection time 
are not within a normal deviation
results/caddy.txt-        These results are probably not that reliable.
results/caddy.txt-
results/caddy.txt-Percentage of the requests served within a certain time (ms)
results/caddy.txt-  50%     22
results/caddy.txt-  66%     27
results/caddy.txt-  75%     30
results/caddy.txt-  80%     32
results/caddy.txt-  90%     38
results/caddy.txt-  95%     43
results/caddy.txt-  98%     50
--
results/compojure.txt:Requests per second:    4989.57 [#/sec] (mean)
results/compojure.txt-Time per request:       20.042 [ms] (mean)
results/compojure.txt-Time per request:       0.200 [ms] (mean, across all 
concurrent requests)
results/compojure.txt-Transfer rate:          20659.95 [Kbytes/sec] received
results/compojure.txt-
results/compojure.txt-Connection Times (ms)
results/compojure.txt-              min  mean[+/-sd] median   max
results/compojure.txt-Connect:        0    9  92.2      0    3048
results/compojure.txt-Processing:     0   11   7.2      9     228
results/compojure.txt-Waiting:        0   10   7.1      9     228
results/compojure.txt-Total:          1   20  92.8     10    3067
results/compojure.txt-
results/compojure.txt-Percentage of the requests served within a certain time 
(ms)
results/compojure.txt-  50%     10
results/compojure.txt-  66%     13
results/compojure.txt-  75%     14
results/compojure.txt-  80%     16
results/compojure.txt-  90%     20
results/compojure.txt-  95%     25
results/compojure.txt-  98%     33
results/compojure.txt-  99%     53
results/compojure.txt- 100%   3067 (longest request)
--
results/flask.txt:Requests per second:    1153.20 [#/sec] (mean)
results/flask.txt-Time per request:       86.715 [ms] (mean)
results/flask.txt-Time per request:       0.867 [ms] (mean, across all 
concurrent requests)
results/flask.txt-Transfer rate:          4799.74 [Kbytes/sec] received
results/flask.txt-
results/flask.txt-Connection Times (ms)
results/flask.txt-              min  mean[+/-sd] median   max
results/flask.txt-Connect:        0    0   0.2      0      12
results/flask.txt-Processing:     2   87   5.3     85     154
results/flask.txt-Waiting:        2   86   5.3     85     154
results/flask.txt-Total:         14   87   5.3     85     154
results/flask.txt-
results/flask.txt-Percentage of the requests served within a certain time (ms)
results/flask.txt-  50%     85
results/flask.txt-  66%     87
results/flask.txt-  75%     88
results/flask.txt-  80%     89
results/flask.txt-  90%     92
results/flask.txt-  95%     96
results/flask.txt-  98%    103
results/flask.txt-  99%    107
results/flask.txt- 100%    154 (longest request)
--
results/guile.txt:Requests per second:    2174.24 [#/sec] (mean)
results/guile.txt-Time per request:       45.993 [ms] (mean)
results/guile.txt-Time per request:       0.460 [ms] (mean, across all 
concurrent requests)
results/guile.txt-Transfer rate:          8888.04 [Kbytes/sec] received
results/guile.txt-
results/guile.txt-Connection Times (ms)
results/guile.txt-              min  mean[+/-sd] median   max
results/guile.txt-Connect:        0    0   0.1      0      10
results/guile.txt-Processing:     4   46   4.8     45      72
results/guile.txt-Waiting:        4   46   4.8     45      71
results/guile.txt-Total:         13   46   4.8     46      72
results/guile.txt-
results/guile.txt-Percentage of the requests served within a certain time (ms)
results/guile.txt-  50%     46
results/guile.txt-  66%     49
results/guile.txt-  75%     50
results/guile.txt-  80%     50
results/guile.txt-  90%     52
results/guile.txt-  95%     53
results/guile.txt-  98%     55
results/guile.txt-  99%     57
results/guile.txt- 100%     72 (longest request)
--
results/plug.txt:Requests per second:    5278.74 [#/sec] (mean)
results/plug.txt-Time per request:       18.944 [ms] (mean)
results/plug.txt-Time per request:       0.189 [ms] (mean, across all 
concurrent requests)
results/plug.txt-Transfer rate:          22125.79 [Kbytes/sec] received
results/plug.txt-
results/plug.txt-Connection Times (ms)
results/plug.txt-              min  mean[+/-sd] median   max
results/plug.txt-Connect:        0    1   1.7      1      26
results/plug.txt-Processing:     0   18   5.8     17      71
results/plug.txt-Waiting:        0   17   5.9     16      70
results/plug.txt-Total:          0   19   5.4     18      71
results/plug.txt-
results/plug.txt-Percentage of the requests served within a certain time (ms)
results/plug.txt-  50%     18
results/plug.txt-  66%     20
results/plug.txt-  75%     21
results/plug.txt-  80%     22
results/plug.txt-  90%     25
results/plug.txt-  95%     29
results/plug.txt-  98%     33
results/plug.txt-  99%     37
results/plug.txt- 100%     71 (longest request)
--
results/scgi.txt:Requests per second:    2643.22 [#/sec] (mean)
results/scgi.txt-Time per request:       37.833 [ms] (mean)
results/scgi.txt-Time per request:       0.378 [ms] (mean, across all 
concurrent requests)
results/scgi.txt-Transfer rate:          10913.63 [Kbytes/sec] received
results/scgi.txt-
results/scgi.txt-Connection Times (ms)
results/scgi.txt-              min  mean[+/-sd] median   max
results/scgi.txt-Connect:        0    0   0.2      0      15
results/scgi.txt-Processing:     0   38 299.9      3   55254
results/scgi.txt-Waiting:        0   37 299.9      2   55254
results/scgi.txt-Total:          0   38 299.9      3   55256
results/scgi.txt-
results/scgi.txt-Percentage of the requests served within a certain time (ms)
results/scgi.txt-  50%      3
results/scgi.txt-  66%      4
results/scgi.txt-  75%      4
results/scgi.txt-  80%      5
results/scgi.txt-  90%      7
results/scgi.txt-  95%     11
results/scgi.txt-  98%   1018
results/scgi.txt-  99%   1030
results/scgi.txt- 100%  55256 (longest request)
--
results/sinatra.txt:Requests per second:    321.36 [#/sec] (mean)
results/sinatra.txt-Time per request:       311.180 [ms] (mean)
results/sinatra.txt-Time per request:       3.112 [ms] (mean, across all 
concurrent requests)
results/sinatra.txt-Transfer rate:          1356.67 [Kbytes/sec] received
results/sinatra.txt-
results/sinatra.txt-Connection Times (ms)
results/sinatra.txt-              min  mean[+/-sd] median   max
results/sinatra.txt-Connect:        0    0   0.2      0       7
results/sinatra.txt-Processing:     4  311 221.5    266    2024
results/sinatra.txt-Waiting:        4  306 221.5    257    2021
results/sinatra.txt-Total:          8  311 221.4    266    2025
results/sinatra.txt-
results/sinatra.txt-Percentage of the requests served within a certain time (ms)
results/sinatra.txt-  50%    266
results/sinatra.txt-  66%    335
results/sinatra.txt-  75%    408
results/sinatra.txt-  80%    458
results/sinatra.txt-  90%    610
results/sinatra.txt-  95%    750
results/sinatra.txt-  98%    933
results/sinatra.txt-  99%   1058
results/sinatra.txt- 100%   2025 (longest request)
--
results/stateful.txt:Requests per second:    581.47 [#/sec] (mean)
results/stateful.txt-Time per request:       171.977 [ms] (mean)
results/stateful.txt-Time per request:       1.720 [ms] (mean, across all 
concurrent requests)
results/stateful.txt-Transfer rate:          2423.63 [Kbytes/sec] received
results/stateful.txt-
results/stateful.txt-Connection Times (ms)
results/stateful.txt-              min  mean[+/-sd] median   max
results/stateful.txt-Connect:        0    0   0.3      0       8
results/stateful.txt-Processing:     1  171 181.4    148    1250
results/stateful.txt-Waiting:        1  166 180.4    143    1247
results/stateful.txt-Total:          1  171 181.4    148    1251
results/stateful.txt-
results/stateful.txt-Percentage of the requests served within a certain time 
(ms)
results/stateful.txt-  50%    148
results/stateful.txt-  66%    175
results/stateful.txt-  75%    250
results/stateful.txt-  80%    258
results/stateful.txt-  90%    284
results/stateful.txt-  95%    557
results/stateful.txt-  98%    847
results/stateful.txt-  99%    975
results/stateful.txt- 100%   1251 (longest request)
--
results/stateless.txt:Requests per second:    658.90 [#/sec] (mean)
results/stateless.txt-Time per request:       151.769 [ms] (mean)
results/stateless.txt-Time per request:       1.518 [ms] (mean, across all 
concurrent requests)
results/stateless.txt-Transfer rate:          2746.63 [Kbytes/sec] received
results/stateless.txt-
results/stateless.txt-Connection Times (ms)
results/stateless.txt-              min  mean[+/-sd] median   max
results/stateless.txt-Connect:        0    1   0.6      1      12
results/stateless.txt-Processing:     7  151 170.3    124    4150
results/stateless.txt-Waiting:        7  127 160.0    102    4122
results/stateless.txt-Total:          8  152 170.2    125    4150
results/stateless.txt-
results/stateless.txt-Percentage of the requests served within a certain time 
(ms)
results/stateless.txt-  50%    125
results/stateless.txt-  66%    143
results/stateless.txt-  75%    157
results/stateless.txt-  80%    166
results/stateless.txt-  90%    197
results/stateless.txt-  95%    257
results/stateless.txt-  98%    638
results/stateless.txt-  99%    792
results/stateless.txt- 100%   4150 (longest request)

Reply via email to