Snel, sneller, snelst: Varnish of Nginx?

xcacheNginx is een lichte en snelle webserver en wordt veel gebruikt voor reverse-proxy en load-balancing. Varnish is een reverse-proxy en heel goed in cachen. Welke van de 2 serveert afbeeldingen sneller in verschillende situaties?

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 ExpiresKeepAlive 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:

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:

  1. Vanuit het geheugen
  2. 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.

Laat een reactie achter

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *