Webservers – rendimiento en PHP script

Otro de los caballos de batalla, con los que debemos lidiar, es el rendimiento en servidores web de contenido dinámico. Y uno de los lenguajes más usados es PHP. Por eso es, sería, importante analizar las diferentes opciones que tenemos a nuestra disposición y sacar nuestras conclusiones. Anteriormente, ya se pudo ver, y hay otros (cientos) análisis que demuestran la potencia de Lighttpd o Nginx en cuanto al servicio de contenido estático. De todas las opciones disponibles, me he centrado particularmente de comparar el rendimiento entre Apache y Nginx. Soy consciente de haber dejado por el camino servidores, también interesantes, como Lighttpd.

Características comunes de los test de rendimiento

Software: AB
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Parámetros:
-n requests Number of requests to perform (100)
-c concurrency Number of multiple request to make (1000)

Hardware
RAM: 3 GB
CPU: 4 cores x Intel(R) Xeon(R) CPU E5410 @ 2.33GHz

Descripción de los webservers
Apache 2.2.3 con mod_php 5.1.6 (prefork)
Nginx 0.8.53 fastcgi php 5.1.6

Escenario
Es una prueba de rendimiento que valora el rendimiento de un servicio web contra otro, pero hay que ser muy consciente de las diferencias intrínsecas entre mod_php y fastcgi.

Cuando tu cargas PHP en Apache como módulo (usando mod_php) cada proceso Apache que ejecutas también contiene un intérprete de PHP el cual en su momento cargará todo lo compilado en liberias las cuales, precisamente, no tienen un tamaño pequeño.

Esto significa que incluso si el proceso Apache acaba de comenzar y está sirviendo imágenes, contendrá un intérprete de PHP con todas las librerias asignadas. Esto en realidad quiere decir que los procesos de Apache utilizan una gran cantidad de memoria y toman algo de tiempo al cargarse (porque PHP y todas las librerias compartidas son linkadas porque necesitan ser cargadas). Es un gran consumo de memoria gastado para servir algo estático como un CSS o una imágen.

FastCGI en contraste carga el intérprete PHP en memoria, lo mantiene allí y Apache sólo lo usa cuando sirve peticiones PHP.

Pero en este test no evaluamos el rendimiento de Apache junto con FastCGI. FastCGI es testeado junto con Nginx. Conviene tener esto en cuenta.

Adicionalmente, se hicieron hasta tres pruebas por servidor web, para ver el rendimiento de los diferentes servicios/modelo con los cacheadores de PHP: Xcache y APC. Los valores para los diferentes test por cacheador fueron estos:

Xcache

xcache.cacher = On
xcache.size = 512M
xcache.count = 4
xcache.slots = 8K

APC
apc.enabled 1
apc.shm_size 512
apc.optimization 0
apc.ttl 0

Consideraciones

  • Después de cada test, se reinició completamente todo el servidor web
  • El número de test hecho por configuración fue tres. De ahí se extrayó el promedio.
  • La configuración por defecto de Apache fue modificada, eliminando de su configuración los módulos no necesarios para su funcionamiento para mod_php
  • La configuración de nginx sufrió algún pequeño cambio como el parámetro work_processes o el timeout, a algo más razonable.
  • El parámetro que hemos valorado más ha sido el “Request per Second”. No hemos tenido en cuenta en los test variables como consumo de cpu o memoria.

Resultados del Test

Links

6 thoughts on “Webservers – rendimiento en PHP script

  1. Pingback: Rubén Ortiz » CentOS – Nginx + PHP FastCGI

  2. Pingback: Rubén Ortiz » Nginx – Nginx como Proxy para Apache

  3. Ignacio says:

    Me imagino que en los resultados del test a mayor número sera peor. Lo digo porque quería instalar Fast-cgi y me echa para atrás ver que rinde la mitad.

  4. Rubén Ortiz says:

    El tema es el rendimiento del apache con mod_php respecto a otras instalaciones. Ahí radica la mayor diferencia. En este caso, nginx con fastcgi dobla a apache mod_php en rendimiento.

Leave a Reply

Your email address will not be published. Required fields are marked *