Rendimiento extremo en php
-
Upload
francisco-javier-vazquez-umbria -
Category
Documents
-
view
617 -
download
3
Transcript of Rendimiento extremo en php
“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: [email protected]
• 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 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
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