PDA

Bekijk Volledige Versie : Varnish vs. Nginx



ju5t
31/08/11, 18:50
Ik zit met een vreemd probleem waar ik niet uit kom. Als test heb ik 3 simpele servers opgezet:
- Apache backend met PHP welke een phpinfo() pagina weer geeft.
- Nginx reverse proxy > apache backend
- Varnish reverse proxy > apache backend

Alle servers zijn default installaties zonder optimalisatie op welk niveau dan ook. Het zijn kleine servers met 1GB ram en 1 core. Niets bijzonders. Nutteloze software is verwijdert en verder draait alleen een Zabbix agent op iedere VM.

De test is extreem simpel:
# ab -n 50000 -c 100 http://10.15.120.5/test1.php

Uit Nginx krijg ik als verwacht een resultaat:

Concurrency Level: 100
Time taken for tests: 76.314583 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: -2066867296 bytes
HTML transferred: -2079267296 bytes
Requests per second: 655.18 [#/sec] (mean)
Time per request: 152.629 [ms] (mean)
Time per request: 1.526 [ms] (mean, across all concurrent requests)
Transfer rate: -26448.75 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 30.0 0 2999
Processing: 0 151 861.9 33 27451
Waiting: 0 92 607.8 30 27449
Total: 0 151 862.4 33 27451

Varnish krijgt op de een of andere manier altijd een timeout vlak voor het eindigen van de benchmark:


apr_poll: The timeout specified has expired (70007)
Total of 49975 requests completed

Of ik er 100k requests van maak of 50k, vlak voor het einde stopt de benchmark met een timeout. De tests worden uitgevoerd vanuit dezelfde testomgeving. Doel is om te kijken welke van de twee uiteindelijk het meest geschikt is als reverse proxy. Ik begrijp dat ip_conntrack op een moment vol loopt. Maar waarom gebeurt dit alleen structureel bij Varnish en heb ik bij Nginx geen problemen? Met -k werkt het overigens wel, maar toch ben ik benieuwd waar het verschil door komt.

Wat zijn verder de ervaringen tussen de twee?

wonko
31/08/11, 23:06
Varnish is een cacher, nginx niet. Je kan ze niet vergelijken. Verder zou je een veelvoud van aantal connecties per seconde moeten waarnemen bij een goed geconfigureerde varnish, de enige limiet is je ram en je cpu (en je netwerkpoort).

Mikey
01/09/11, 00:02
En of je stress tool niet over zijn eigen benen struikelt. Wat geeft varnishstat voor waardes weer ? Is de hit & mis wel samen het juiste aantal ?

wijtec
01/09/11, 00:30
Lijkt te maken te hebben met het max aantal connecties wat je tegelijk kan doen:
http://serverfault.com/questions/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server

QBell
01/09/11, 00:48
Varnish is een cacher, nginx niet. Je kan ze niet vergelijken. Verder zou je een veelvoud van aantal connecties per seconde moeten waarnemen bij een goed geconfigureerde varnish, de enige limiet is je ram en je cpu (en je netwerkpoort).

en / of de snelheid van het geheugen....
Hier ben ik tegen aan gelopen met Varnish.

Verder moet ik zeggen dat ik er nu al een jaartje of 1 1/2 gebruik van maak met volle tevredenheid.
Momenteel gooi ik er tussen de 500 - 4000 requests per seconden doorheen (500 minimaal altijd, 4000 tijdens peak).

ju5t
01/09/11, 09:44
Lijkt te maken te hebben met het max aantal connecties wat je tegelijk kan doen:
http://serverfault.com/questions/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server

Dat weet ik. Het vreemde is alleen dat met dezelfde test configuratie ik wel tegen het probleem aan loop bij Varnish en niet bij Nginx.


Varnish is een cacher, nginx niet. Je kan ze niet vergelijken.

Het enige verschil wat ik zie is dat Varnish gemaakt is om als reverse proxy te werken en nginx zo ingesteld kan worden. Neemt niet weg dat je ze op beide kunt testen. Veel van onze klanten gebruiken nginx omdat het makkelijk te installeren is binnen cPanel en bovenal gratis.


En of je stress tool niet over zijn eigen benen struikelt.

Zeker mogelijk. Het is beter om een x aantal machines te gebruiken om echt de max te halen maar dat is nu het doel nog niet.

Na het opschalen van de resources naar 2GB RAM met dezelfde CPU lijkt het Varnish te zijn die struikelt. Varnishstat is leeg en heeft een runtime van een paar seconde. Tijdens de test is de server niet bereikbaar. Misschien zit er ergens een fout in onze configuratie?

Ik start Varnish met malloc,1536M.


# This is a basic VCL configuration file for varnish. See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition. Set this to point to your content
# server.
#
backend default {
.host = "10.15.120.50";
.port = "80";
}

################################################## ######
# BACKEND CONFIGURATION
################################################## ######
backend backend1 {
.host = "10.15.120.51";
.port = "80";
}


# add http headers
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}

sub vcl_recv {
set req.url = regsuball(req.url,"\?gclid=[^&]+$","");
set req.url = regsuball(req.url,"\?gclid=[^&]+&","?");
set req.url = regsuball(req.url,"&gclid=[^&]+","");

# only deal with get and head request
# post should be passed on to the backend
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}

################################################## ######
# VIRTUAL HOSTS CONFIGURATION
################################################## ######
if (req.http.host ~ "^(www.)?internalhostname.net") {
# images, css, javascript and other static content
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
#lookup;
unset req.http.cookie;
}
# set the backend
set req.backend = backend1;
}

# cache content longer in case the backend is unavailable
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 24h;

# make the complete page anonymous
# we can't do anything with it anyway
unset req.http.cookie;
}

return (lookup);
}

Mikey
01/09/11, 10:24
Ik mis je deamon options:

thread_pools
thread_pool_min
thread_pool_max
thread_pool_add_delay

ju5t
01/09/11, 11:07
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=100
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=5000


Ik gebruik het standaard script wat bij de RPM zit. VARNISH_MIN_THREADS was overigens 1. Ophogen naar 100 zorgt er voor dat het wel lukt om 100k hits af te vuren op Varnish. Dat lijkt het dus aardig op te lossen.