1. “NGINX, PHP-FPM y APC:
Rendimiento extremo en PHP”
Algeciras, jueves 28 de Noviembre de 2013
2. INDICE
Toda pagina 2 necesita uno
• 1. Introducción
• 2. LAMP clásico vs LEMP moderno
• 3. PHP y PHP-FPM (FastCGI Process Manager)
• 4. PHP-APC (Alternative PHP Cache)
• 5. Apache vs nginx
• 6. Un vistazo al futuro
• 7. Cosas que seguramente no daran tiempo
3. 1. INTRODUCCION
Who am I
• Francisco Javier Vázquez
• SysAdmin y Backend Developer
• PHP Advanced Developer
• Email: f5inet@gmail.com
• Twitter: @f5inet
• Blog: f5inet.blogspot.com.es
• Intereses: PHP, C#, Java, Networking, P2P,
HTML5, WebRTC, Economia y Bitcoin
5. 2. LAMP vs LEMP
Quien es quien
LAMP
• Linux (kernel 2.4+)
• Apache (1.3+)
• Mysql (5.0+)
• PHP (4.3+)
LEMP
• Linux (kernel 3.4+)
• Nginx (1.2+)
• Mysql (5.5+)
• PHP (5.4+ en modo Daemon
y con cache de Opcode)
7. 3. PHP y PHP-FPM
Prueba: bench.php
• Muy intenso en ejecución
• Son varios algoritmos de ordenación y varias
pruebas pesadas mas
• Queremos saber como de rápido son las
distintas versiones de PHP
• Ab –n<x> -c1 bench.php
• ¿Cuánto tiempo tarda?
9. 3. PHP y PHP-FPM
el malo, el feo y el bueno
Mod_php
• Primera
solución a
integrar PHP
con APACHE
• Todo proceso
Apache lleva el
interprete PHP
incrustado,
aunque no sea
necesario
CGI/FastCGI
• Solución para
ahorrar
memoria con
respecto a
mod_php
• Se ejecuta un
interprete PHP
bajo demanda
FCGI Process
Manager
• Gestor de
procesos PHP
• Cuando se le
pide a FPM
ejecutar PHP,
deja procesos
PHP abiertos
durante un
tiempo
10. 3. PHP y PHP-FPM
Un lugar para cada cosa
• Mod_php casi no se usa. Se usaba en PHP4.x o
inferiores (aun se usa en Windows)
• FastCGI es lo que se suele usar cuando se
instala Apache en entornos linux
• Con nginx es recomendable usar FPM, porque
se supone que buscamos máximo rendimiento
11. 3. PHP y PHP-FPM
Conclusiones
• Típicamente, una nueva versión de PHP, aumenta
el rendimiento entre un 15% y un 40%
• Por lo tanto:
¡Usa siempre la ultima versión de PHP!
• PHP tarda en compilar un script una media de
300ms. Un cache de Opcode (APC/OPC) elimina
‘recompilaciones’, haciendo el sitio mas rápido.
• PHP-FPM es ideal para mantener un tiempo de
respuesta reducido y un uso contenido de
memoria
13. 4. PHP-APC
¿Qué es un cache de código?
• Es una memoria intermedia,
incrustada en el proceso PHP,
para guardar las compilaciones
de los scripts PHP
• Aumenta el rendimiento de PHP
entre 3 y 4 veces en la misma
maquina (de media)
• También proporciona memoria
compartida entre procesos PHP
¿En
cache?
SI
NO
14. 4. PHP-APC
APC como memoria compartida
• Imagínate la memoria compartida de APC como
un gigantesco array, o diccionario clave->valor,
compartido entre todos los procesos PHP.
• No es infinita, la cache caduca y de vez en cuando
se limpia ella misma.
• Se puede especificar el tamaño en php.ini o en
apc.ini. Mira phpinfo() para saber donde.
• 32 o 64MB de APC es algo normal.
• Buscad apc.php para tener un panel de control.
15. 4. PHP-APC
APC como memoria compartida
• apc_exist($key);
• apc_store($key, $valor);
• $valor= apc_fetch($key);
Uso comun:
<?php
$sqlquery=‘SELECT * FROM songs WHERE id=1587’;
$valor=array();
If (apc_exist(md5($sqlquery)))
$valor=apc_fetch(md5($sqlquery));
else
{
$res=mysql_query($sqlquery);
while ($row=mysql_fetch_assoc($res))
$valor[]=$row;
apc_store(md5($sqlquery),$valor);
}
//usa $valor para algo util…
?>
17. 4. PHP-APC
Mejorando PHP-APC
• Apc.stat=0 para evitar comprobar si el fichero
PHP se ha modificado, se usa la cache a ciegas
• Si usas apc.stat=0, ten cuidado con el código
automodificable
• Apc.enable_cli=1 para permitir que APC este
disponible en línea de comandos
• Se suele usar para scripts ‘cron’ que rellenan
y/o refrescan cache APC
18. 4. PHP-APC
Instalando PHP-APC
• Aptitude install php-apc
• Reinicia el demonio php-fpm, nginx o apache.
• Eso es todo
• ¡OJO! APC no es compatible con PHP5.5+,
deberéis usar APCu que tiene ‘algunas’
incompatibilidades (por ejemplo, APCu no
soporta apc_exists())
20. 5. Apache vs nginx
Historia: el problema C10K
• C10K: ¿Cómo podríamos servir a 10.000
clientes concurrentes?
• Planteado en 1999, en
http://www.kegel.com/c10k.html
• Kegel quería servir 10k clientes con un P3-866
con 256MB de RAM
• Aun hoy día, se ha avanzado poco,
comparativamente hablando, en su solución.
21. 5. Apache vs nginx
¿Orientado a tareas o a eventos?
APACHE
• Apache ha sido el servidor
web clásico en Linux, y el
que ha dado a la vida gran
parte de la World Wide
Web
• Su filosofía de trabajo es:
‘1 cliente, 1 proceso’
NGINX
• Servidor web creado para
darle una solución a C10K
• Su filosofía es: 1 o varios
procesos, que responden a
eventos cuando se
completan tareas.
• Unos pocos procesos,
atienden varios clientes, a
través de una ‘cola’
22. 5. Apache vs nginx
Prueba: Wordpress 3.7 ‘vainilla’
• Instalación por defecto
• «vainilla», sin ningún plugin
• Queremos saber como se comporta en
situación de carga
• Ab –n1000 –c<x> index.php
• ¿Cuánto tiempo tarda en total?
24. 5. Apache vs nginx
Conclusión
• Usa nginx.
• Los módulos de Apache no son compatibles con nginx
• Aun si necesitas módulos de apache comunes, como
mod_rewrite (muy usados en SEO) o directorios
protegidos con contraseña mediante .htpasswd, nginx
tiene módulos similares
• Pero claro, tendrás que ensuciarte las manos y
reescribir o rehacer las configuraciones de los módulos
• nginx obra maravillas en situaciones de alta
concurrencia. Si no es tu caso, quizás no te merezca la
pena el cambio
29. 6. Un vistazo al futuro
PHP5.5 y OPCache
• PHP5.5+Opcache es un 8% mas rápido que PHP5.4+APC
• Es un cache de opcodes pero no permite memoria
compartida.
• Esto no indica la muerte de APC, pero si que se debe de ir
abandonando, al estilo de eAccelerator, Xcache y similares
• Memcached, apcu y yac como sustitutos de APC
• Ubuntu 13.10 dispone de php5-apcu y una via de upgrade
limpia desde ubuntu 13.04 y php-apc (con algunas
incompatibilidades)
• Ve contra-corriente y usa CDB (dba_open
("/tmp/name.db","n","cdb"))
http://engineering.wayfair.com/moving-constants-out-of-apc-and-into-cdb/
32. 7. Cosas que no darán tiempo
Frameworks PHP
• http://systemsarchitect.net/performance-
benchmark-of-popular-php-frameworks/
• Solo un loco usaría Symfony2 o CakePHP si
pretende un sitio rápido
• Symfony2 iguala a FuelPHP si se usa un cache de
Opcode (no mostrado en el benchmark)
• CodeIgniter es el Framework PHP famoso mas
rápido (y el recomendado por el creador de PHP)
• Phalcom PHP es el mas rápido con diferencia.
33. 7. Cosas que no darán tiempo
El ‘demonio’ del COW
• COW=Copy On Write
• Actualmente, PHP solo ‘copia’ datos si estos son
modificados. Una asignación es muy rápida.
• Gran parte de los aumentos de velocidad en las
versiones de PHP vienen dados por mejores
implementaciones de COW.
• Ejemplo: Supongamos $a como un array tridimensional
que ocupa un montón
$b=$a; //rápido
$b[30][26][87]=8; //lento, es aquí donde realmente se
hace la copia del array tridimensional
34. 7. Cosas que no darán tiempo
El ‘demonio’ del COW
• Intenta no modificar ‘reasignaciones’ dentro de bucles,
provocan COW de las nuevas variables. Ejemplo:
$b=$a;
$b=$b.’agrego’; //COW en $b
• No hagas reasignaciones ‘vanas’. Puesto que al existir 2
referencias a los mismos datos, una modificación de la
variable original provocaran un COW. Ejemplo:
$b=$a;
//hago algo con $b
$a=$a.’agrego’; //COW en $a, mejor hacer antes un
unset($b); para evitar el COW
35. 7. Cosas que no darán tiempo
El ‘demonio’ del COW
• ¿Quieres mas información sobre COW?
http://blog.golemon.com/2007/01/youre-being-lied-to.html