SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
“NGINX, PHP-FPM y APC:
Rendimiento extremo en PHP”
Algeciras, jueves 28 de Noviembre de 2013
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
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
LAMP vs LEMP
Lo viejo y lo nuevo
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)
PHP y PHP-FPM
Versiones y formas de ejecutar PHP
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?
3. PHP y PHP-FPM
Velocidad PHP: bench.php
0
50
100
150
200
250
300
350
ubu 4.10 PHP
4.3
ubu 6.06 PHP
5.1
ubu 8.04 PHP
5.2
ubu 10.04
PHP 5.3
ubu 12.04
PHP 5.3
ubu 13.04
PHP 5.4
ubu 13.10
PHP 5.5
ubu 13.04
PHP 5.4+apc
deb 7.2 PHP
5.4
bench1
bench2
bench10
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
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
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
PHP-APC
Alternative PHP Cache
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
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.
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…
?>
4. PHP-APC
SQLbench.php: blanco y en botella
UBUNTU 13.10: APACHE 2.4 + PHP 5.5 + Opcache + APCu + MySQL 5.5
Insertando 500 filas ...
Insertadas 500 filas en 4.24 segundos
Aprox. 118 inserts por segundo
NOCACHE: id=200 20000 veces... 8.62 Segundos, 2320 Selects/seg.
SERIALIZE: id=200 20000 veces... 2.65 Segundos, 7540 Selects/seg. (x3)
APC: id=200 20000 veces... 0.09 Segundos, 220201 Selects/seg. (x100)
NOCACHE: id ALEATORIA 20000 veces... 9.03 Segundos, 2214 Selects/seg.
SERIALIZE: id ALEATORIA 20000 veces... 4.05 Segundos, 4930 Selects/seg. (x2)
APC: id ALEATORIA 20000 veces... 0.13 Segundos, 154735 Selects/seg. (x75)
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
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())
Apache vs nginx
Se dice ‘enyineks’, por eso las iniciales LEMP
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.
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’
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?
5. Apache vs nginx
WP3.7, conex. concurrentes
0
50
100
150
200
250
300
350
400
450
Apa22+PHP54 Apa22+PHP54+apc Apa24+PHP55(OPc) Ngi13+PHP54+fpm+apc
10
100
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
INTERLUDIO
Instalando LEMP
5.5. Interludio
Instalando LEMP
• En Ubuntu 13.04 o 13.10, escribid esto:
aptitude install nginx php5-fpm mysql-server
mysql-client php5-mysql php5-curl php5-gd
php5-intl php-pear php5-imagick php5-imap
php5-mcrypt php5-ming php5-ps php5-pspell
php5-recode php5-snmp php5-sqlite php5-
tidy php5-xmlrpc php5-xsl
5.5. Interludio
Instalando LEMP
• Editad /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80 default_server ipv6only=on;
root /home/www;
index index.html index.htm index.php /index.php;
server_name _;
location / {
try_files $uri $uri/ /index.html;
}
location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /.ht {
deny all;
}
}
Un vistazo al futuro
PHP5.5 y OPC
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/
Cosas que no darán tiempo
O eso creo
7. Cosas que no darán tiempo
Frameworks PHP
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.
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
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
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
Gracias

Más contenido relacionado

La actualidad más candente

MongoDB Atlas: La mejor forma de utilizar MongoDB en la nube 2
MongoDB Atlas: La mejor forma de utilizar  MongoDB en la nube 2MongoDB Atlas: La mejor forma de utilizar  MongoDB en la nube 2
MongoDB Atlas: La mejor forma de utilizar MongoDB en la nube 2MongoDB
 
Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014mszuchman
 
DevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas RotasDevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas RotasRicard Clau
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Ricard Clau
 
Configurando un servidor para Moodle
Configurando un servidor para MoodleConfigurando un servidor para Moodle
Configurando un servidor para MoodleDennis Cohn
 
OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...
OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...
OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...OpenNebula Project
 
Aceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHPAceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHPJuan Belón Pérez
 
Nodejs.introduccion
Nodejs.introduccionNodejs.introduccion
Nodejs.introduccionkillfill
 
NodeJS y MongoDB
NodeJS y MongoDBNodeJS y MongoDB
NodeJS y MongoDBArsys
 
Los casos de uso para In-Memory OLTP
Los casos de uso para In-Memory OLTPLos casos de uso para In-Memory OLTP
Los casos de uso para In-Memory OLTPSpanishPASSVC
 
Introduccion a Ansible
Introduccion a AnsibleIntroduccion a Ansible
Introduccion a AnsibleOsvaldo
 
El uso correcto de MySQLi
El uso correcto de MySQLi El uso correcto de MySQLi
El uso correcto de MySQLi Arsys
 

La actualidad más candente (18)

Protocol HTTP
Protocol HTTPProtocol HTTP
Protocol HTTP
 
MongoDB Atlas: La mejor forma de utilizar MongoDB en la nube 2
MongoDB Atlas: La mejor forma de utilizar  MongoDB en la nube 2MongoDB Atlas: La mejor forma de utilizar  MongoDB en la nube 2
MongoDB Atlas: La mejor forma de utilizar MongoDB en la nube 2
 
Aspectos nodejs
Aspectos nodejsAspectos nodejs
Aspectos nodejs
 
Servidores web: cloud
Servidores web: cloudServidores web: cloud
Servidores web: cloud
 
Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014
 
DevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas RotasDevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas Rotas
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2
 
Configurando un servidor para Moodle
Configurando un servidor para MoodleConfigurando un servidor para Moodle
Configurando un servidor para Moodle
 
OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...
OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...
OpenNebulaConf 2016 - Fast Prototyping of a C.O. into a Micro Data Center - A...
 
Cache en la Web
Cache en la WebCache en la Web
Cache en la Web
 
Aceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHPAceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHP
 
Nodejs.introduccion
Nodejs.introduccionNodejs.introduccion
Nodejs.introduccion
 
Introducción a Ansible
Introducción a AnsibleIntroducción a Ansible
Introducción a Ansible
 
NodeJS y MongoDB
NodeJS y MongoDBNodeJS y MongoDB
NodeJS y MongoDB
 
Los casos de uso para In-Memory OLTP
Los casos de uso para In-Memory OLTPLos casos de uso para In-Memory OLTP
Los casos de uso para In-Memory OLTP
 
Qnap Broadcast 2020
Qnap Broadcast 2020Qnap Broadcast 2020
Qnap Broadcast 2020
 
Introduccion a Ansible
Introduccion a AnsibleIntroduccion a Ansible
Introduccion a Ansible
 
El uso correcto de MySQLi
El uso correcto de MySQLi El uso correcto de MySQLi
El uso correcto de MySQLi
 

Destacado (20)

Bios personal
Bios personalBios personal
Bios personal
 
Sram
SramSram
Sram
 
11-Instalación de Xampp
11-Instalación de Xampp11-Instalación de Xampp
11-Instalación de Xampp
 
Bios Personal Subir
Bios Personal SubirBios Personal Subir
Bios Personal Subir
 
Bios Curso Fpo
Bios Curso Fpo Bios Curso Fpo
Bios Curso Fpo
 
Memorias nec
Memorias necMemorias nec
Memorias nec
 
RIM: Industry Analysts ¿Decepciona a sus consumidores? - por Trino Alvarez y ...
RIM: Industry Analysts ¿Decepciona a sus consumidores? - por Trino Alvarez y ...RIM: Industry Analysts ¿Decepciona a sus consumidores? - por Trino Alvarez y ...
RIM: Industry Analysts ¿Decepciona a sus consumidores? - por Trino Alvarez y ...
 
La Memoria Ram
La Memoria RamLa Memoria Ram
La Memoria Ram
 
Bios personal de keny
Bios personal de kenyBios personal de keny
Bios personal de keny
 
Memorias ram sus antecedentes [autoguardado]
Memorias ram sus antecedentes [autoguardado]Memorias ram sus antecedentes [autoguardado]
Memorias ram sus antecedentes [autoguardado]
 
Nv sram
Nv sramNv sram
Nv sram
 
Alimentacion inteligente2
Alimentacion inteligente2Alimentacion inteligente2
Alimentacion inteligente2
 
hatware y sotfware
hatware y sotfwarehatware y sotfware
hatware y sotfware
 
Memorias SDRAM Y RDRAM
Memorias SDRAM Y RDRAMMemorias SDRAM Y RDRAM
Memorias SDRAM Y RDRAM
 
Modelos de profesores formadores de Profesores de Matemática: ¿cuáles son y e...
Modelos de profesores formadores de Profesores de Matemática: ¿cuáles son y e...Modelos de profesores formadores de Profesores de Matemática: ¿cuáles son y e...
Modelos de profesores formadores de Profesores de Matemática: ¿cuáles son y e...
 
Rdram
RdramRdram
Rdram
 
Clase5 memorias
Clase5 memoriasClase5 memorias
Clase5 memorias
 
Memoria sdram arquitectura
Memoria sdram arquitecturaMemoria sdram arquitectura
Memoria sdram arquitectura
 
Taller cpu
Taller cpuTaller cpu
Taller cpu
 
Tipos memorias
Tipos memoriasTipos memorias
Tipos memorias
 

Similar a Rendimiento extremo en php

Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magentoOnestic
 
Aceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHPAceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHPJuan Belón Pérez
 
Aceleradores PHP Final - Programador PHP
Aceleradores PHP Final - Programador PHPAceleradores PHP Final - Programador PHP
Aceleradores PHP Final - Programador PHPJuan Belón Pérez
 
Why Apache Flink is better than Spark by Rubén Casado
Why Apache Flink is better than Spark by Rubén CasadoWhy Apache Flink is better than Spark by Rubén Casado
Why Apache Flink is better than Spark by Rubén CasadoBig Data Spain
 
Apache ha muerto, Viva Lighttpd
Apache ha muerto, Viva LighttpdApache ha muerto, Viva Lighttpd
Apache ha muerto, Viva Lighttpdruna
 
Optimización de aplicaciones PHP (server side)
Optimización de aplicaciones PHP (server side)Optimización de aplicaciones PHP (server side)
Optimización de aplicaciones PHP (server side)Oriol Jiménez
 
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Francisco Javier Toscano Lopez
 
Qnap nas training latam 2016 0810
Qnap nas training latam 2016 0810Qnap nas training latam 2016 0810
Qnap nas training latam 2016 0810QNAP Systems, Inc.
 
Taller de optimizacion de servidores web tipo LAMP
Taller de optimizacion de servidores web tipo LAMPTaller de optimizacion de servidores web tipo LAMP
Taller de optimizacion de servidores web tipo LAMPYannick Warnier
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoRaul Fraile
 
Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)Irontec
 
Alta disponibilidad con Pacemaker
Alta disponibilidad con PacemakerAlta disponibilidad con Pacemaker
Alta disponibilidad con PacemakerNelson Calero
 
Servidor Web Apache para Linux
Servidor Web Apache para LinuxServidor Web Apache para Linux
Servidor Web Apache para LinuxMaría del Cisne
 

Similar a Rendimiento extremo en php (20)

Tuning Lamp
Tuning LampTuning Lamp
Tuning Lamp
 
Performance en Drupal 7
Performance en Drupal 7Performance en Drupal 7
Performance en Drupal 7
 
Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magento
 
Aceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHPAceleradores Php Final - Programador PHP
Aceleradores Php Final - Programador PHP
 
Aceleradores PHP Final - Programador PHP
Aceleradores PHP Final - Programador PHPAceleradores PHP Final - Programador PHP
Aceleradores PHP Final - Programador PHP
 
Why Apache Flink is better than Spark by Rubén Casado
Why Apache Flink is better than Spark by Rubén CasadoWhy Apache Flink is better than Spark by Rubén Casado
Why Apache Flink is better than Spark by Rubén Casado
 
Gestión Remota de Equipos con Python
Gestión Remota de Equipos con PythonGestión Remota de Equipos con Python
Gestión Remota de Equipos con Python
 
Kohana
KohanaKohana
Kohana
 
Curso de php
Curso de phpCurso de php
Curso de php
 
Apache ha muerto, Viva Lighttpd
Apache ha muerto, Viva LighttpdApache ha muerto, Viva Lighttpd
Apache ha muerto, Viva Lighttpd
 
Optimización de aplicaciones PHP (server side)
Optimización de aplicaciones PHP (server side)Optimización de aplicaciones PHP (server side)
Optimización de aplicaciones PHP (server side)
 
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
 
Qnap nas training latam 2016 0810
Qnap nas training latam 2016 0810Qnap nas training latam 2016 0810
Qnap nas training latam 2016 0810
 
Training LATAM
Training LATAMTraining LATAM
Training LATAM
 
Docker y PostgreSQL
Docker y PostgreSQLDocker y PostgreSQL
Docker y PostgreSQL
 
Taller de optimizacion de servidores web tipo LAMP
Taller de optimizacion de servidores web tipo LAMPTaller de optimizacion de servidores web tipo LAMP
Taller de optimizacion de servidores web tipo LAMP
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimiento
 
Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)Introducción a varnish cache (@irontec)
Introducción a varnish cache (@irontec)
 
Alta disponibilidad con Pacemaker
Alta disponibilidad con PacemakerAlta disponibilidad con Pacemaker
Alta disponibilidad con Pacemaker
 
Servidor Web Apache para Linux
Servidor Web Apache para LinuxServidor Web Apache para Linux
Servidor Web Apache para Linux
 

Rendimiento extremo en php

  • 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
  • 4. LAMP vs LEMP Lo viejo y lo nuevo
  • 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)
  • 6. PHP y PHP-FPM Versiones y formas de ejecutar PHP
  • 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?
  • 8. 3. PHP y PHP-FPM Velocidad PHP: bench.php 0 50 100 150 200 250 300 350 ubu 4.10 PHP 4.3 ubu 6.06 PHP 5.1 ubu 8.04 PHP 5.2 ubu 10.04 PHP 5.3 ubu 12.04 PHP 5.3 ubu 13.04 PHP 5.4 ubu 13.10 PHP 5.5 ubu 13.04 PHP 5.4+apc deb 7.2 PHP 5.4 bench1 bench2 bench10
  • 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… ?>
  • 16. 4. PHP-APC SQLbench.php: blanco y en botella UBUNTU 13.10: APACHE 2.4 + PHP 5.5 + Opcache + APCu + MySQL 5.5 Insertando 500 filas ... Insertadas 500 filas en 4.24 segundos Aprox. 118 inserts por segundo NOCACHE: id=200 20000 veces... 8.62 Segundos, 2320 Selects/seg. SERIALIZE: id=200 20000 veces... 2.65 Segundos, 7540 Selects/seg. (x3) APC: id=200 20000 veces... 0.09 Segundos, 220201 Selects/seg. (x100) NOCACHE: id ALEATORIA 20000 veces... 9.03 Segundos, 2214 Selects/seg. SERIALIZE: id ALEATORIA 20000 veces... 4.05 Segundos, 4930 Selects/seg. (x2) APC: id ALEATORIA 20000 veces... 0.13 Segundos, 154735 Selects/seg. (x75)
  • 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())
  • 19. Apache vs nginx Se dice ‘enyineks’, por eso las iniciales LEMP
  • 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?
  • 23. 5. Apache vs nginx WP3.7, conex. concurrentes 0 50 100 150 200 250 300 350 400 450 Apa22+PHP54 Apa22+PHP54+apc Apa24+PHP55(OPc) Ngi13+PHP54+fpm+apc 10 100
  • 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
  • 26. 5.5. Interludio Instalando LEMP • En Ubuntu 13.04 o 13.10, escribid esto: aptitude install nginx php5-fpm mysql-server mysql-client php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5- tidy php5-xmlrpc php5-xsl
  • 27. 5.5. Interludio Instalando LEMP • Editad /etc/nginx/sites-available/default server { listen 80; listen [::]:80 default_server ipv6only=on; root /home/www; index index.html index.htm index.php /index.php; server_name _; location / { try_files $uri $uri/ /index.html; } location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location ~ /.ht { deny all; } }
  • 28. Un vistazo al futuro PHP5.5 y OPC
  • 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/
  • 30. Cosas que no darán tiempo O eso creo
  • 31. 7. Cosas que no darán tiempo Frameworks PHP
  • 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