Posts Tagged ‘ApacheBench’

Ajustar concurrencia en Apache

Friday, December 28th, 2007

Leyendo descubrí esta fantástica herramienta llamada ApacheBench que viene junto a Apache. Con ella podemos determinar la performance de nuestro servidor. Como dice el man de apachebench: “Especialmente te muestra como muchas solicitudes por segundo es capaz de servir tu instalación de Apache”. Mediante la salida de está herramienta podremos saber cómo configurar correctamente el módulo MPM que tengamos compilado. El modulo MPM que tengamos compilado por default depende del sistema operativo

Modulos MPM según la plataforma
SO MPM
BeOS beos
Netware mpm_netware
OS/2 mpmt_os2
Unix prefork worker
Windows mpm_winnt

Para saber que MPM tiene nuestro servidor, ejecute

 #apache2ctl -l
...
mod_logio.c
prefork.c
http_core.c
…

A ver veamos un poco de teoría para saber como funcionan MPM. Un servidor web pre-forking, no maneja hilos para atender a las solicitudes. En cambio las solicitudes son tratas de una manera similar a como lo hacía Apache 1.3, creando un nuevo proceso hijo por cada una. La ventajas de esto es que si surge un problema con una solicitud, esta no afecta al resto, ya que cada proceso hijo es independiente del resto y maneja una única solicitud, por lo tanto ganamos en estabilidad. Una desventaja es que perdemos escalabilidad. La creación de procesos es muy lenta, comparada con la de hilos, por lo tanto para tratar varias solicitudes simultaneas este modelo no es muy adecuado. También es importante notar que todos los hilos de un mismo hilo comparten sus recursos, logrando que los hilos sean más “livianos” que los procesos. Por ejemplo un servidor web threaded, maneja varias solicitudes en un solo proceso hijo, por cada solicitud el proceso hijo le asigna un hilo, de esta manera dentro de un hijo hay varios hilos, si uno tiene un problema afecta al al hijo y a todos sus hilos.

En el archivo de configuracion de apache (/etc/apache2/apache2.conf) tenemos la siguiente configuración de MPM


    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0

Ahora haremos una prueba con apachebench, haremos 100 solicitudes concurrentes y en total 200 solicitudes y veremos como responde el servidor

ab -n 200 -c 100 http://localhost

la salida es


Completed 100 requests
Finished 200 requests

Server Software:        Apache/2.2.4
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        153 bytes

Concurrency Level:      100
Time taken for tests:   0.117805 seconds
Complete requests:      200
Failed requests:        0
Write errors:           0
Total transferred:      82205 bytes
HTML transferred:       31365 bytes
Requests per second:    1697.72 [#/sec] (mean)
Time per request:       58.902 [ms] (mean)
Time per request:       0.589 [ms] (mean, across all concurrent requests)
Transfer rate:          679.09 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    9   8.2      6      18
Processing:     6   37  18.5     41      61
Waiting:        3   35  18.1     39      59
Total:         22   47  11.8     53      70

Percentage of the requests served within a certain time (ms)
  50%     53
  66%     54
  75%     55
  80%     57
  90%     60
  95%     61
  98%     61
  99%     62
 100%     70 (longest request)

Un parámetro a tener en cuenta es Request per second, que en este caso dio 1697.72. Variando los valores de las directivas MPM, por ejemplo MaxClients, y ejecutando nuevamente apachebench, el valor de Request per second crecerá o bajará en función del cambio.