Usando docker-compose para orquestar servidores nginx y mejorar tiempos de respuesta

Vamos a realizar una simple prueba de carga contra un servidor nginx de 10000 request con 500 concurrencias. Lo vamos a balancear con haproxy y veremos como montando más contenedores dockers se mejoran los tiempos de respuesta.

Para ello vamos a empezar creando un docker-compose.yml con un solo contenedor nginx:

web1:
image: dockercloud/hello-world
expose:
- 80

Levantamos el stack con:

$ docker-compose up -d

Y ahora hacemos la prueba de carga, usaremos el programa ab de Apache:

$ ab -n 10000 -c 500 http://localhost/
...
...
Concurrency Level: 500
Time taken for tests: 14.802 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 6350000 bytes
HTML transferred: 4730000 bytes
Requests per second: 675.57 [#/sec] (mean)
Time per request: 740.121 [ms] (mean)
Time per request: 1.480 [ms] (mean, across all concurrent requests)
Transfer rate: 418.93 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 55 328.4 0 3014
Processing: 55 519 881.3 207 8064
Waiting: 27 517 881.6 206 8064
Total: 62 574 954.2 208 8510

Percentage of the requests served within a certain time (ms)
50% 208
66% 235
75% 289
80% 1079
90% 1351
95% 2722
98% 3301
99% 4171
100% 8510 (longest request)

Bien, ahora vamos a cambiar el fichero docker-compose.yml y añadiremos hasta 5 contenedores nginx y el balanceador haproxy, quedando así:

haproxy:
image: tutum/haproxy
links:
- web1
- web2
- web3
- web4
- web5
ports:
- "80:80"

expose:
- "80"

web1:
image: dockercloud/hello-world
expose:
- 80

web2:
image: dockercloud/hello-world
expose:
- 80

web3:
image: dockercloud/hello-world
expose:
- 80

web4:
image: dockercloud/hello-world
expose:
- 80

web5:
image: dockercloud/hello-world
expose:
- 80

Antes de ejecutar la prueba de carga, vamos a parar el stack y volverlo a levantar:

$ docker-compose stop
$ docker-compose up -d

$ ab -n 10000 -c 500 http://localhost/
...
...
Concurrency Level: 500
Time taken for tests: 8.004 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 6350000 bytes
HTML transferred: 4730000 bytes
Requests per second: 1249.43 [#/sec] (mean)
Time per request: 400.183 [ms] (mean)
Time per request: 0.800 [ms] (mean, across all concurrent requests)
Transfer rate: 774.79 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 112 358.8 1 3066
Processing: 24 263 137.2 253 1417
Waiting: 24 247 133.8 236 1370
Total: 24 375 395.0 263 3464

Percentage of the requests served within a certain time (ms)
50% 263
66% 304
75% 336
80% 363
90% 1139
95% 1298
98% 1387
99% 1483
100% 3464 (longest request)

Podemos apreciar que los tiempos se reducen significativamente, por ejemplo el “Time taken for tests” de 14.802 a 8.004 segundos, la media del tiempo de conexión de a 574 a 375 ms y de forma similar otros valores.

Como deciamos al principio, mejoramos los tiempos de respuesta con los mismos recursos de hardware pero utilizando contenedores docker.

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *