rendimiento extremo en php

36
“NGINX, PHP-FPM y APC: Rendimiento extremo en PHP” Algeciras, jueves 28 de Noviembre de 2013

Upload: francisco-javier-vazquez-umbria

Post on 13-Jun-2015

613 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Rendimiento extremo en php

“NGINX, PHP-FPM y APC:

Rendimiento extremo en PHP”

Algeciras, jueves 28 de Noviembre de 2013

Page 2: Rendimiento extremo en php

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

Page 3: Rendimiento extremo en php

1. INTRODUCCION Who am I

• Francisco Javier Vázquez

• SysAdmin y Backend Developer

• PHP Advanced Developer

• Email: [email protected]

• Twitter: @f5inet

• Blog: f5inet.blogspot.com.es

• Intereses: PHP, C#, Java, Networking, P2P, HTML5, WebRTC, Economia y Bitcoin

Page 4: Rendimiento extremo en php

LAMP vs LEMP

Lo viejo y lo nuevo

Page 5: Rendimiento extremo en php

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)

Page 6: Rendimiento extremo en php

PHP y PHP-FPM

Versiones y formas de ejecutar PHP

Page 7: Rendimiento extremo en 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?

Page 8: Rendimiento extremo en php

3. PHP y PHP-FPM Velocidad PHP: bench.php

0

50

100

150

200

250

300

350

ubu 4.10 PHP4.3

ubu 6.06 PHP5.1

ubu 8.04 PHP5.2

ubu 10.04PHP 5.3

ubu 12.04PHP 5.3

ubu 13.04PHP 5.4

ubu 13.10PHP 5.5

ubu 13.04PHP 5.4+apc

deb 7.2 PHP5.4

bench1

bench2

bench10

Page 9: Rendimiento extremo en php

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

Page 10: Rendimiento extremo en php

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

Page 11: Rendimiento extremo en php

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

Page 12: Rendimiento extremo en php

PHP-APC

Alternative PHP Cache

Page 13: Rendimiento extremo en php

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

Page 14: Rendimiento extremo en php

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.

Page 15: Rendimiento extremo en php

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… ?>

Page 16: Rendimiento extremo en php

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)

Page 17: Rendimiento extremo en php

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

Page 18: Rendimiento extremo en php

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())

Page 19: Rendimiento extremo en php

Apache vs nginx

Se dice ‘enyineks’, por eso las iniciales LEMP

Page 20: Rendimiento extremo en php

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.

Page 21: Rendimiento extremo en php

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’

Page 22: Rendimiento extremo en php

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?

Page 23: Rendimiento extremo en php

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

Page 24: Rendimiento extremo en php

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

Page 25: Rendimiento extremo en php

INTERLUDIO

Instalando LEMP

Page 26: Rendimiento extremo en php

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

Page 27: Rendimiento extremo en php

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; } }

Page 28: Rendimiento extremo en php

Un vistazo al futuro

PHP5.5 y OPC

Page 29: Rendimiento extremo en php

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/

Page 30: Rendimiento extremo en php

Cosas que no darán tiempo

O eso creo

Page 31: Rendimiento extremo en php

7. Cosas que no darán tiempo Frameworks PHP

Page 32: Rendimiento extremo en 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.

Page 33: Rendimiento extremo en php

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

Page 34: Rendimiento extremo en php

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

Page 35: Rendimiento extremo en php

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

Page 36: Rendimiento extremo en php

Gracias