Pequeño benchmark de Nginx vs. Apache

04 Nov 2010


Bueno hoy es 4 de noviembre, día de la bandera en Panamá. Muchos de nosotros tenemos el día libre - bueno nosotros lo pagamos trabajando el fin de semana un poco - y llegando de la playa tuve la idea de hacer un pequeño benchmark entre Nginx y Apache, ambos corriendo la misma aplicación. La aplicación es el sitio de Panagamers el cuál está hecho utilizando CodeIgniter con un par de librerías de otros frameworks (Zend, más que nada).

Lo estoy corriendo en mi máquina, por lo que las características técnicas son las sigueintes: Procesador: AMD Phenom II X4 955 @ 3.2 GHz. Memoria: 4GB Corsair XMS3 CL9. PHP: 5.3 (corriendo en FGCI en Nginx). CodeIgniter: 1.7.2. Apache:  Nginx: 0.8.53. Sistema Operativo de la prueba: Windows 7 Home Premium (sí, no use Ubuntu ahora, luego lo pruebo en Ubuntu). Lo que usé fue el profiler de CodeIgniter que despliega información de benchmark. La temática de la prueba es simple: poner a funcionar la aplicación sobre ambas plataformas (Nginx y Apache) y revisar el profiler del homepage en ambas y comparar el tiempo de carga y uso de memoria en ambos servidores. Nginx Primera vez que uso Nginx realmente. La instalación fue bastante sencilla. Bajar el .zip, descomprimir en algún lado cualquiera y hacer dos scripts: Uno para Start y el otro para Stop de la aplicación. Start: @ECHO OFF C:\Users\demogar\Desktop\nginx-0.8.53\RunHiddenConsole.exe D:\xampp\php\php-cgi.exe -b 127.0.0.1:9000 start nginx EXIT Stop:

@ECHO OFF nginx -s quit taskkill /f /IM php-cgi.exe EXIT

Se crea un acceso directo (o se le pone en el escritorio, por ejemplo) y listo. Tenemos dos pequeños scripts de inicio y muerte del pequeño proceso. La configuración del PHP sobre FCGI es sencilla y en la web se habla mucho de eso, así que no la explicaré en detalle. Al correr la aplicación sobre Nginx estos fueron los resultados: Loading Time Base Classes 0.0620 s Controller Execution Time ( Indice / Index ) 1.1122 s Total Execution Time 1.1743 s Uso de memoria 3,723,776 bytes Usando JMeter, haciendo un loop de 20, los resultados de carga son los siguientes: Máximo: 2.176 s Mínimo: 1.05 s Promedio: 1.201 s Utilizando Perfmon para revisar el uso de memoria de los procesos, el proceso de Nginx nunca utilizó más de 1.786 KB de memoria.

Apache (XAMPP) Usando Apache (corriendo sobre XAMPP) para correr la aplicación es aún más simple. Varios Next, next, next y ok hicieron el trabajo. Los resultados fueron un poco curiosos, no los que esperaba: Loading Time Base Classes   0.0516 s Controller Execution Time ( Indice / Index )   1.0959 s Total Execution Time   1.1476 s Uso de memoria 3,905,208 bytes Usando JMeter los resultados fueron los siguientes: Máximo: 1.440 s Mínimo: 1.049 s Promedio: 1.134 s Utilizando Perfmon para revisar el uso de memoria de los procesos, Apache utilizaba 50 MB de memoria, muy por encima de Nginx.

Aunque los resultados parecen indicar que la aplicación está corriendo un poco más rápido en Apache, el uso de memoria (y proceasdor) en Apache si se disparaba notablemente, algo que es muy interesante a tomar en cuenta en nuestros servidores compartidos. En fin, quiero probar ambos en Linux a ver si todo se mantiene igual o cambia. Nota: No soy experto en configuración de Nginx y estoy muy seguro que debe haber varias configuraciones que mejoren el performance.


Demóstenes García G.

Ingeniero Electrónico con experiencia en Ingeniería y Desarrollo de Software. Agilista, interesado en Analítica y Ciencia de Datos. Co-fundador en Pixmat, CIO en IFARHU. Twitter.