Recibe actualizaciones por: rss | twitter | email

Varnish vs Nginx

Escrito por:
Fecha: 2013-05-06 16:36:35 00:00

Version en ingles

Esta es la traducción a un artículo que escribí en 2011, ahora que estoy escribiendo en español he comenzado a traducir algunos de los artículos que no tienen una fecha de expiración y aún son válidos.

Las pruebas descritas adelante fueron realizadas en vivo, y colocando Nginx y Varnish en frente de Drupal con el módulo "boost" activado.

Dicho módulo crea versiones estáticas de las páginas visitadas y las guarda en el disco duro, permitiendo que luego Nginx or Varnish sirvan dichas páginas en subsecuentes solicitudes, liberando así a Apache de tener que generar nuevamente las páginas.

Comencemos con una breve introducción a Nginx y Varnish.

nginx (pronunciado en inglés “engine X”) es un servidor web/proxy inverso ligero de alto rendimiento y un proxy para protocolos de correo electrónico (IMAP/POP3) Originalmente, nginx fue desarrollado para satisfacer las necesidades de varios sitios web de Rambler que recibían unas 500 millones de peticiones al día en septiembre de 2008. – Wikipedia.

Ahora Varnish:

Varnish Cache es un acelerador de aplicaciones web, también conocido como caché de proxy HTTP inversa. Se instala delante de cualquier servidor HTTP y se configura para almacenar en caché una copia del recurso solicitado. Ideado para aumentar el rendimiento de las aplicaciones web. Una de las características clave, además de su rendimiento, es la flexibilidad de su configuración de lenguaje VCL. VCL permite determinar las políticas a tomar sobre las peticiones de entrada. En esta política se puede decidir qué contenido desea servir, desde donde se desea obtener el contenido y la forma en que la solicitud o la respuesta debe ser alterada.

Ambos Varnish y Nginx pueden utilizarse como cache inversos, y también para balanceo de carga entre dos o más servidores Apache que sirven contenido dinámico.

Comparando Nginx vs Varnish

Ahora, para las pruebas a realizar se tiene el siguiente escenario.

Apache + MySQL + PHP (conocido como LAMP stock) Sobre esto se esta utilizando el gestor de contenido (CMS por su siglas en ingles) Drupal, a la vez, Drupal tiene cargado el módulo boost. Este módulo es similar a Super Cache para Wordpress, pues genera copias estáticas de las páginas visitadas para que estas sean presentadas al vistante, estas tienen un tiempo de duración definido por el administrador, luego del cual caducan y se generan nuevamente.

En este escenario, estaremos probando por lo tanto la capacidad de Nginx y Varnish para servir simple y puro contenido estático.

Test 1

Contenido estático –> Nginx –> Varnish –> Usuario Final

Test 2

Contenido estático –> Nginx –> Usuario Final

Podremos ver si justifica usar Vanish, cuando tenemos a Nginx, sirviendo el contenido estático y también determinar cual es más veloz.

Para las pruebas, se usará ab y httperf como las herramientas para generar tráfico.

Estos son los comando utilizados en las pruebas:

ab -kc 500 -n 10000 http://10.1.1.1/

Y

httperf --hog --server=10.1.1.1 --wsess=2000,10,2 --rate 300 --timeout 5

Ambos corriendo desde el mismo servidor en 10.1.1.2 (misma red)

Resultados

Resultados de ab en contra de Varnish + Nginx

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.go2linux.org (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        nginx/1.0.0
Server Hostname:        10.1.1.1
Server Port:            80

Document Path:          /
Document Length:        26362 bytes

Concurrency Level:      500
Time taken for tests:   44.919 seconds
Complete requests:      10000
Failed requests:        40
(Connect: 0, Receive: 0, Length: 39, Exceptions: 1)
Write errors:           0
Keep-Alive requests:    9961
Total transferred:      267744926 bytes
HTML transferred:       263938086 bytes
Requests per second:    222.62 [#/sec] (mean)
Time per request:       2245.958 [ms] (mean)
Time per request:       4.492 [ms] (mean, across all concurrent requests)
Transfer rate:          5820.89 [Kbytes/sec] received

Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    5  70.1      0    3849
Processing:     0 2183 1213.6   1850   18296
Waiting:        0 1214 561.9   1300    4248
Total:          0 2187 1224.2   1850   18312

Percentage of the requests served within a certain time (ms)
50%   1850
66%   2200
75%   2650
80%   2850
90%   3348
95%   3799
98%   5904
99%   6214	
100%  18312 (longest request)

El CPU del server fue de 0.00 a 0.12 de carga y Varnish estaba usando un 7% de los 768 Megas de RAM durante las pruebas.

Se puede ver abajo también un ejemplo de la salida de varnishhist durante las pruebas.

varnishhist con Varnish bajo alta carga

Resultados de ab en contra Nginx

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.go2linux.org (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        nginx/1.0.0
Server Hostname:        10.1.1.1
Server Port:            80

Document Path:          /
Document Length:        26362 bytes
		
Concurrency Level:      500
Time taken for tests:   44.219 seconds
Complete requests:      10000
Failed requests:        130
(Connect: 0, Receive: 0, Length: 130, Exceptions: 0)
Write errors:           0
Non-2xx responses:      130
Keep-Alive requests:    9870
Total transferred:      268179303 bytes
HTML transferred:       264475966 bytes
Requests per second:    226.15 [#/sec] (mean)
Time per request:       2210.965 [ms] (mean)
Time per request:       4.422 [ms] (mean, across all concurrent requests)
Transfer rate:          5922.61 [Kbytes/sec] received

Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0   27 280.7      0    3649
Processing:    53 2066 2231.4   1348   20751
Waiting:       11  722 524.5    651    8697
Total:         71 2094 2277.4   1348   20768

Percentage of the requests served within a certain time (ms)
50%   1348
66%   1351
75%   1950
80%   2000
90%   3801
95%   7249
98%  10998
99%  13001
100%  20768 (longest request)

El CPU fue de 0.00 a 0.04, como se ve menos CPU que Varnish.

Los rendimientos fueron similares, con resultados de al rededor de 220 requerimientos por segundo contestados.

Con httperf sobre Varnish y Nginx

Maximum connect burst length: 11

Total: connections 1439 requests 10081 replies 9581 test-duration 46.890 s

Connection rate: 30.7 conn/s (32.6 ms/conn, <=1022 concurrent connections)
Connection time [ms]: min 5250.8 avg 26105.0 max 41659.1 median 30597.5 stddev 11292.6
Connection time [ms]: connect 621.9
Connection length [replies/conn]: 6.790

Request rate: 215.0 req/s (4.7 ms/req)
Request size [B]: 71.0

Reply rate [replies/s]: min 124.4 avg 212.8 max 252.6 stddev 42.2 (9 samples)
Reply time [ms]: response 568.8 transfer 1343.6
Reply size [B]: header 363.0 content 26274.0 footer 0.0 (total 26637.0)
Reply status: 1xx=0 2xx=9581 3xx=0 4xx=0 5xx=0

CPU time [s]: user 2.47 system 44.41 (user 5.3% system 94.7% total 100.0%)
Net I/O: 5330.5 KB/s (43.7*10^6 bps)

Errors: total 1480 client-timo 81 socket-timo 0 connrefused 0 connreset 419
Errors: fd-unavail 980 addrunavail 0 ftab-full 0 other 0

Session rate [sess/s]: min 0.00 avg 20.03 max 94.01 stddev 39.55 (939/2000)
Session: avg 1.41 connections/session
Session lifetime [s]: 38.1
Session failtime [s]: 1.2
Session length histogram: 979 10 52 11 3 4 2 0 0 0 939

Con httperf sobre Nginx

Maximum connect burst length: 25

Total: connections 1529 requests 10167 replies 9570 test-duration 46.361 s

Connection rate: 33.0 conn/s (30.3 ms/conn, <=1022 concurrent connections)
Connection time [ms]: min 2007.5 avg 24596.6 max 43647.4 median 33599.5 stddev 15689.1
Connection time [ms]: connect 512.1
Connection length [replies/conn]: 6.309

Request rate: 219.3 req/s (4.6 ms/req)
Request size [B]: 72.0

Reply rate [replies/s]: min 150.6 avg 212.5 max 238.4 stddev 29.2 (9 samples)
Reply time [ms]: response 464.2 transfer 1495.6
Reply size [B]: header 369.0 content 26274.0 footer 0.0 (total 26643.0)
Reply status: 1xx=0 2xx=9570 3xx=0 4xx=0 5xx=0

CPU time [s]: user 2.16 system 44.19 (user 4.7% system 95.3% total 100.0%)
Net I/O: 5386.3 KB/s (44.1*10^6 bps)

Errors: total 1580 client-timo 90 socket-timo 0 connrefused 0 connreset 510
Errors: fd-unavail 980 addrunavail 0 ftab-full 0 other 0

Session rate [sess/s]: min 0.00 avg 20.04 max 108.61 stddev 40.80 (929/2000)
Session: avg 1.48 connections/session
Session lifetime [s]: 38.5
Session failtime [s]: 1.5
Session length histogram: 958 37 31 19 14 6 4 2 0 0 929

Conclusiones

Como puede observarse de los resultados de estas pruebas, la verdad no se tiene grandes ventajas al usar Varnish si es contenido estático lo que se está sirviendo. En realidad el usar uno u otro no va a depender de cual es más eficiente, si no mas bien de cual conoces mejor y de otras funcionalidad que pudieran ofrecer y que de alguna manera requieras en tu aplicación.

La mejor manera de definir cual es mejor para ti, es probando uno y otro por algún tiempo en frente de tu aplicación real y en vivo.