Yesterday I switched the primary source of my blog to Kaho, my Raspberry Pi behind a broadband connection.
Why? Just for fun.
In fact there is another server between you and the Raspberry Pi as illustrated below to prevent overloads and downtimes (fonts are served by the main server to save bandwidth):
Since I switched my blog to Octopress, the webserver is only serving static files so I don't need a lot of resources to host it. Nginx is enough.
I made some load tests with siege to know how much connections the raspberry pi and my connection can handle in this configuration (serving small static files).
HAProxy configuration
As I said, there is a frontend server which dispatches requests on my Raspberry Pi or the local server according to its availability.
I use this configuration:
frontend webfront
// ...
acl is_blog_kdecherf_com hdr_dom(host) -i blog.kdecherf.com
acl is_fonts path_beg /fonts
use_backend cluster_local if is_blog_kdecherf_com is_fonts
use_backend cluster_blog if is_blog_kdecherf_com
backend cluster_blog
mode http
option httplog
option httpclose #Disable keepalive
option forwardfor
balance first
server kaho raspip:8000 maxconn 20 check inter 5000 rise 2 fall 5
server shaolan 127.0.0.1:8000 check inter 2000 rise 2 fall 5
// ...
In this configuration, requests on /fonts
are always forwarded to the local webserver (to limit latency due to the size of files) but other requests are forwarded to the Raspberry Pi within the limit of 20 concurrent sessions (thanks to balance first
available in HAProxy 1.5).
Broadband connection limit
My first test was done with 5 concurrent connections, there is no load (glances uses 17% of CPU) and the throughput is low:
$ siege -f urls.txt -i -c 5 -t 1m
Lifting the server siege... done.
Transactions: 486 hits
Availability: 99.79 %
Elapsed time: 59.14 secs
Data transferred: 2.05 MB
Response time: 0.10 secs
Transaction rate: 8.22 trans/sec
Throughput: 0.03 MB/sec
Concurrency: 0.81
Successful transactions: 486
Failed transactions: 1
Longest transaction: 3.16
Shortest transaction: 0.06
The number of concurrent connections was increased to 15 for the second test, results are good too:
$ siege -f urls.txt -i -c 15 -t 1m
Lifting the server siege... done.
Transactions: 1548 hits
Availability: 99.49 %
Elapsed time: 59.33 secs
Data transferred: 6.33 MB
Response time: 0.09 secs
Transaction rate: 26.09 trans/sec
Throughput: 0.11 MB/sec
Concurrency: 2.23
Successful transactions: 1548
Failed transactions: 8
Longest transaction: 0.14
Shortest transaction: 0.07
After these tests, my connection can handle ~40 concurrent connections but can raspberry pi handle more connections?
Local test
Two other tests were done on my local network with 50 and 150 concurrent connections.
The Raspberry Pi had no problem to serve 50 concurrent connections as you can see:
$ siege -f urls.txt -i -c 50 -t 1m
Lifting the server siege... done.
Transactions: 5552 hits
Availability: 100.00 %
Elapsed time: 59.34 secs
Data transferred: 22.91 MB
Response time: 0.03 secs
Transaction rate: 93.56 trans/sec
Throughput: 0.39 MB/sec
Concurrency: 3.24
Successful transactions: 5552
Failed transactions: 0
Longest transaction: 0.81
Shortest transaction: 0.00
The response time is higher (470ms is still a really good response time) with 150 concurrent connections and the CPU is full:
$ siege -f urls.txt -i -c 150 -t 1m
Lifting the server siege... done.
Transactions: 9156 hits
Availability: 100.00 %
Elapsed time: 59.84 secs
Data transferred: 37.75 MB
Response time: 0.47 secs
Transaction rate: 153.01 trans/sec
Throughput: 0.63 MB/sec
Concurrency: 72.57
Successful transactions: 9156
Failed transactions: 0
Longest transaction: 1.03
Shortest transaction: 0.00
So in this configuration the Raspberry Pi can handle more than 150 rps!
Yes, I keep a SPOF if the loadbalancer becomes unavailable but this configuration is just for the fun of self-hosting on a Raspberry Pi.
Enjoy!