In dit artikel wordt een testsysteem gebruikt wat virtueel in VirtualBox is geïnstalleerd. Het gaat om een Ubuntu 10.04 64-bit installatie welke geheel up-to-date is (2.6.32-24-server #41-Ubuntu SMP). De VM heeft 2 processoren tot zijn beschikking op 3.6 Ghz en beschikt over 1024 MB intern geheugen.
De versie van Varnish is 2.1.0-2 en de gebruikte Nginx versie is 0.7.65-1. De Virtualbox Guest-Additions zijn up to date en geïnstalleerd.
De benchmark wordt uitgevoerd met ab. Deze zal met verschillende variabelen gebruikt worden om de belasting te meten. Ook wordt nog naar het verschil gekeken tussen het gebruik van het geheugen of de harde schijf als het gaat om het cachen in Varnish.
Varnish zal Apache als back-end hebben vanwege de functie van Varnish: het is een reverse-proxy. Daarom moet Varnish zijn bestand ergens vandaan halen voordat het uit de cache geserveerd kan worden. Nginx zal als webserver geconfigureerd worden en zal zijn bestanden zelf kunnen serveren.
Globaal worden de volgende instellingen gebruikt:
- Zowel Varnish als Nginx zullen ingesteld worden op het IP-adres 192.168.1.100 en luisteren naar poort 80.
- Varnish zal als backend Apache hebben vanwege het ophalen van de afbeeldingen bij de eerste aanvraag. Daarna zal de afbeelding uit de cache geserveerd worden.
- Apache wordt ingesteld op het IP-adres 127.0.0.1 en luistert naar poort 80.
- Zowel Varnish als Nginx zullen 2 verschillende afbeeldingen gaan serveren voor de benchmark. Deze staan in de map /var/www/test/.
- Apache geen gebruik maken van de modules Headers en Expires. KeepAlive staat opoff om te zorgen dat Varnish zijn werk goed kan doen. KeepAlive staat bij Nginx vanzelfsprekend ook uit.
- Logging voor Apache en Nginx is uitgeschakeld om ervoor te zorgen dat de processen hierdoor niet worden vertraagd.
Afbeeldingen
De volgende 2 bestanden zijn gebruikt voor het benchmarken:
- Grote afbeelding (550 x 365 pixels, 51KB)
- Thumbnail (133 x 88 pixels, 3KB)
De bestanden worden hernoemd in deze test:
De grote afbeelding heet beach.jpg en de thumbnail thumb.jpg.
Varnish cache
Varnish kan op 2 manieren cachen:
- Vanuit het geheugen
- Vanuit een bestand op de harde schijf
Beide opties hebben hun eigen voordelen en daarom zal gekeken worden welke keuze sneller is in deze testomgeving.
Geheugen cache
De volgende instellingen zijn voor de daemon van Varnish gebruikt (/etc/default/varnish)
DAEMON_OPTS="-a 192.168.1.100:80 \ -T localhost:6082 \ -f /etc/varnish/default.vcl \ -S /etc/varnish/secret \ -s malloc,16M"
De optie -s malloc definieert een geheugen cache van 16 MB, in dit geval genoeg ruimte voor de afbeeldingen die in het geheugen wordt geplaatst.
Het configuratiebestand van Varnish ziet er als volgt uit(/etc/varnish/default.vcl)
backend default { .host = "127.0.0.1"; .port = "80"; } sub vcl_recv { if (req.request == "GET" && req.url ~ "\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") { unset req.http.cookie; return (lookup); } } sub vcl_fetch { if (req.request == "GET" && req.url ~ "\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") { unset beresp.http.set-cookie; set beresp.ttl = 7d; return(deliver); } }
Alle extensies die in dit bestand zijn opgegeven worden gestript van cookies, en vervolgens in de cache geplaatst voor 7 dagen. Alle overige aanvragen waaraan niet kan worden voldaan worden naar de backend gestuurd.
Schijf cache
De 2e manier van cachen in Varnish is vanuit een bestand.
Daarvoor moet de opties voor de daemon van Varnish aangepast worden.
Open /etc/default/varnish
Pas de volgende regel aan:
-s malloc, 16M
naar
-s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,16M"
Verder is de configuratie hetzelfde als bij Geheugen cache
Nginx
De configuratie van Nginx (/etc/nginx/sites-enabled/default):
server { listen 192.168.1.100:80 default; access_log off; location / { root /var/www/test; index index.html index.htm; } }
Benchmarks
Varnish en Nginx zullen aan de volgende benchmarks worden blootgesteld:
- 500 aanvragen van 5 bezoekers tegelijk
- 1 000 aanvragen van 50 bezoekers tegelijk
- 10 000 aanvragen van 150 bezoekers tegelijk
- 10 000 aanvragen van 300 bezoekers tegelijk
Elke benchmark wordt uitgevoerd op beide bestanden, beach.jpg en thumb.jpg.
Resultaten
Nginx webserver
Nginx | beach.jpg (req/s) | thumb.jpg (req/s) | Gem. (ms) 95% beach.jpg | Gem. (ms) 95% thumb.jpg |
500 – 5 | 9898.64 | 11259.99 | 1 | 1 |
1 000 – 50 | 9247.61 | 11398.48 | 8 | 7 |
10 000 – 150 | 10334.01 | 11572.00 | 17 | 15 |
10 000 – 300 | 8259.78 | 11248.16 | 40 | 30 |
Bij meer gebruikers tegelijk laat Nginx vanaf 10 000 en 300 bezoekers tegelijk een enorm gat vallen met de resultaten die daarvoor behaald zijn.
Benchmark met Varnish en disk-cache
Schijf | beach.jpg (req/s) | thumb.jpg (req/s) | Gem. (ms) 95% beach.jpg | Gem. (ms) 95% thumb.jpg |
500 – 5 | 4674.38 | 6449.37 | 1 | 2 |
1 000 – 50 | 6895.32 | 8098.15 | 12 | 12 |
10 000 – 150 | 7257.99 | 9054 | 30 | 22 |
10 000 – 300 | 2525.40 | 2813.92 | 46 | 35 |
Benchmark met Varnish en geheugen-cache
Geheugen | beach.jpg (req/s) | thumb.jpg (req/s) | Gem. (ms) 95% beach.jpg | Gem. (ms) 95% thumb.jpg |
500 – 5 | 5657.00 | 6519 | 1 | 1 |
1 000 – 50 | 6323.55 | 8004.87 | 10 | 12 |
10 000 – 150 | 6617.25 | 9188.40 | 27 | 20 |
10 000 – 300 | 6336.58 | 3185.56 | 53 | 24 |
Met deze resultaten is er maar 1 conclusie mogelijk: Nginx ligt mijlenver voor op Varnish wat betreft snelheid. Vooral bij veel gebruikers tegelijk laat Nginx zien wat het kan.