You are on page 1of 54

Afinando ...

Copyleft Alejandro Castn Salinas http://www.xtec.net/~acastan/textos/ Creative Commons by-nc-sa 2.5

Afinando LAMP
Realizar cambios en la configuracin de nuestro servidor para mejorar el rendimiento:

Cambios en el hardware Cambios en el sistema operativo: Linux Cambios en los servicios e intrpretes: Apache, PHP, MySQL Cambios en las aplicaciones

Cmo trabaja LAMP?

aplicaciones php APACHE PHP LINUX HARDWARE MySQL

Cmo trabaja LAMP?


contenido esttico: html, imgenes, ... contenido dinmico: aplicaciones php Clientes APACHE LINUX HARDWARE PHP MySQL

Cmo trabaja LAMP?

Medir el rendimiento

Medir para saber cul es el cuello de botella. Medir para hacer predicciones sobre el futuro, cuando el nmero de peticiones al servidor crezca. Medir el rendimiento antes y despus de cada cambio, para ver qu ha mejorado. Los cambios se deben medir de uno en uno.

Medir el rendimiento: monitor del sistema, top, ...

Medir el rendimiento: cURL

curl mide el tiempo de respuesta de un servidor web ante la peticin de un nico elemento:
$curlo/dev/nullsw%{time_connect}:%{time_starttransfer}:%{time_total}\ http://www.laquimera.org 0.081:0.272:0.779

Procesar peticin y comenzar a enviar datos = 0.272 0.081 = 0.191 segundos Enviar todos los datos = 0.779 - 0.272 = 0.507 segundos

Medir el rendimiento: Firefox Tamper Data

https://addons.mozilla.org/es-ES/firefox/addon/966

Medir el rendimiento: Apache


Apache HTTP server benchmarking tool (ab) es una utilidad incluida en Apache con la que hacer pruebas de carga sobre servidores web.
$abn1000c5http://www.servidor.com/pagina.html Timetakenfortests:42.907696seconds Failedrequests:0 Totaltransferred:584000bytes Requestspersecond:23.31[#/sec](mean) Timeperrequest:214.538[ms](mean) Timeperrequest:42.908[ms](mean,acrossconcurrentrequests) Transferrate:13.28[Kbytes/sec]received ConnectionTimes(ms) minmean[+/sd]medianmax Connect:89105189.1923089 Processing:9410734.2101669 Waiting:9210529.199445 Total:184213191.91943192

Medir el rendimiento: MySQL


Toman ficheros con peticiones e interrogan el servidor de base de datos el nmero de veces que queramos y con el nmero de conexiones concurrentes que deseemos.

MySQL Super Smack


http://vegan.net/tony/supersmack/

MyBench
http://jeremy.zawodny.com/mysql/mybench/

Medir el rendimiento: ms ...

Easy system monitoring with SAR


http://www.ibm.com/developerworks/aix/library/au-unix-perfmonsar.html

Expose Web performance problems with the RRDtool


http://www.ibm.com/developerworks/edu/dw-esdd-webperfrrd-i.html

Monitoring Virtual Memory with vmstat


http://www.linuxjournal.com/article/8178

Afinar el hardware
No es el objetivo de esta gua. Segn donde est el cuello de botella podemos cambiar:

CPU ms rpida, con varios ncleos, 64 bits. Aumentar la memoria RAM. Discos duros ms rpidos, RAID. Ancho de banda de conexin al exterior. Ms mquinas: separar servidor web y servidor BBDD, clster+balanceo carga.

Afinar las aplicaciones


No es el objetivo de esta gua. Depende de cada problema. Los programadores pueden:

Optimizar el cdigo del programa PHP. Optimizar la estructura de tablas y las consultas al servidor de BBDD.

Afinar Linux: TCP/IP


$sudovim/etc/sysctl.conf #ActivalasTCPsyncookiescontralosataquesdeSYNFlooding net.ipv4.tcp_syncookies=1 #Aumentaeltamaodeventana(paquetesenviadosantesdeunACK) net.ipv4.tcp_window_scaling=1 #Incrementaeltamaodelosbuffersdellegadayenvodepaquetes. #Permitenalasaplicacionesdelservidortomardatosmsrpidamente, #yalclienteenviarmsdatosaunqueelservidorestocupado net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.ipv4.tcp_rmem=40968738016777216 net.ipv4.tcp_wmem=40966553616777216 #Incrementaelnmerodeconexionesquepuedenserservidas net.ipv4.ip_local_port_range=102465000 $sudosysctlp/etc/sysctl.conf

Afinar Linux: discos - atime


Cada vez que accedemos a un fichero, aunque sea para lectura, el sistema de ficheros guarda una marca de tiempo.
$sudovim/etc/fstab #DispositivoDirectorioFSOpciones /dev/hda1noneswapdefaults00 /dev/hda2/ext3defaults,noatime01 /dev/hda3/homeext3defaults,noatime02 none/procprocdefaults00 /dev/fd0/mnt/floppyautonoauto,user,noexec,rw00 /dev/cdrom/mnt/cdromiso9660noauto,user,noexec,ro00 $sudomount/oremount $sudomount/homeoremount

Afinar Linux: discos - hdparm


Permite afinar el acceso a los discos IDE: 32 bits, tipo de DMA, ... con cuidado!
$sudohdparmt/dev/sda Timingbuffereddiskreads:162MBin3.00seconds=53.99MB/sec $sudohdparmvi/dev/sda caractersticasquesoportaylasactivas

$sudohdparmc1/dev/sda activaelmododetransferenciade32bits $sudohdparmmx/dev/sda transfierexsectoresporinterrupcin $sudohdparmd1Xx/dev/sda activalastransferenciasDMAy estableceelmododeDMAalespecificadoporx

Guardar en algn script de inicio, como por ejemplo rc.local

Afinar Linux: NFS


Si utilizamos carpetas en red (evitar NFSv2)

En el cliente:

$sudovim/etc/fstab #DispositivoDirectorioFSOpciones host2:/tmp/mnt/host2nfsrsize=32768,wsize=32768,intr,noatime #bloquesde32Kb,lasoperacionesseinterrumpensisecuelgan,noatime ... $sudomount/oremount

En el servidor suficientes threads NFS:

$sudonfsstatrc callsretransauthrefrsh 146590381300 $sudorpc.nfsd64

Afinar Apache: Cmo funciona?


Diferentes tipos de Apache:

Apache compilado estticamente con las funciones necesarias. Es rpido y ligero, pero no se pueden aadir nuevas funciones sin recompilar. Apache compilado dinmicamente. Los mdulos se cargan a medida que se necesitan nuevas funciones. El corazn de Apache (Multi Processing Modules) no se puede cambiar sin recompilar.

Afinar Apache: Cmo funciona?


Diferentes Multi Processing Modules:

Prefork: seguro, varios procesos hijos, un proceso por peticin, bueno para 1 o 2 CPUs, uso grande de memoria. Worker: menos tolerante a fallos, varios procesos hijos cada uno con varios threads, un thread por peticin, bueno para sistemas multiprocesador, menor consumo de memoria.

$httpdl$apache2lparasaberqueMPMutilizanuestroapache

Afinar Apache: Cmo funciona?

Al iniciar Apache se crean varios procesos hijo para atender peticiones. Un proceso hijo atiende una peticin y despus se queda en reserva, a la espera de que llegue una peticin nueva. Las peticiones que no se pueden atender porque hemos llegado al mximo de procesos y ninguno est libre, esperan en una cola.

Afinar Apache: Cmo funciona?

Como crear un nuevo proceso cuando llega una peticin es lento, se intenta que siempre hayan servidores en reserva preparados para atender alguna peticin. Si todos los procesos estn ocupados, se crean un mnimo de procesos en reserva. Si hay muchos procesos desocupados, se matan para que slo haya un mximo de procesos en reserva.

Afinar Apache: Cmo funciona?

Los procesos nacen pesando 3Mb pero al servir contenido dinmico engordan hasta 20Mb y ya nunca adelgazan:
$psylCapache2paraverloquepesanlosprocesos(columnaRSS)

Cuando un proceso ha servido muchas peticiones, se mata y se crea uno nuevo. As evitamos los errores de memoria solicitada para atender una peticin y no liberada.

Afinar Apache: MPM


Los valores por defecto son muy conservadores. Ajustmoslos:
$sudovim/etc/apache2/apache2.conf #Procesosquesecreanalarrancar #Unbuenvaloreselpromediodepeticionessimultneas StartServers50 #Mnimoymximodeprocesosenreserva MinSpareServers15 MaxSpareServers30 #Numeromximodepeticionessimultneasqueseatendern #Unbuenvaloreselpicodiariodepeticiones(vigilasuficienteRAM) MaxClients225 #Nmerodepeticionesdeunprocesoantesdemorir MaxRequestsPerChild4000 $sudo/etc/init.d/apache2restart

Afinar Apache: Cmo funciona?

Apache permite especificar opciones que se aplicarn a cada directorio y sus correspondientes subdirectorios: contraseas, restringir IPs, etc. 1 manera: lneas <Directory ...> en el fichero de configuracin /etc/apache2/apache2.conf 2 manera: ficheros .htaccess en cada directorio. Los puede poner el propietario de esa parte de la web.

Afinar Apache: buscar ficheros

Cuando Apache sirve contenido, primero busca el fichero .htaccess del directorio del contenido y tambin de todos los directorios anteriores (hasta llegar a la raz), para poder aplicar las opciones especificadas para el directorio. Se puede cambiar este comportamiento con la opcin AllowOverride a valor None, y moviendo la informacin imprescindible de los .htaccess a las lneas <Directory> del fichero /etc/apache2/apache2.conf

Afinar Apache: buscar ficheros

Si por seguridad desactivamos enlaces simblicos para no servir contenido que est fuera de los directorios de la web, Apache comprueba que el fichero a servir y cada uno de los directorios des de la raz no sean enlaces simblicos. Se puede cambiar este comportamiento con la opcin Options -FollowSymLinks y activndola slo en los directorios imprescindibles

Afinar Apache: buscar ficheros


Un ejemplo:
$sudovim/etc/apache2/apache2.conf #Opcionesparaeldirectoriorazysubdirectorios #Ignoramoslosficheros.htaccessynocomprobamosenlacessimblicos <Directory/> AllowOverrideNone OptionsFollowSymLinks </Directory> #Opcionesparalosdirectoriosdelosusuarios(*esuncomodn) #Comprobamosquelosusuariosnohayanpuestoenlacessimblicos <Directory/home/*/public_html> OptionsFollowSymLinks </Directory> #Opcionesadicionalesparapepito.Antesestabanenun.htaccess <Directory/home/pepito/public_html/proyectosecreto> AuthUserFile/home/pepito/.htpassword </Directory> $sudo/etc/init.d/apache2restart

Afinar Apache: DNS inverso


Apache anota en los logs los nombres de las mquinas que han realizado peticiones, en lugar de su IP. Para ello ha de realizar solicitudes de DNS inverso por cada IP que le solicita algo. Desactivemos este comportamiento. Luego podemos utilizar la herramienta logresolve para encontrar los nombres en los logs:
$sudovim/etc/apache2/apache2.conf HostnameLookupsoff $sudo/etc/init.d/apache2restart

Afinar Apache: DNS inverso


Lo mismo pasa si al usar las directivas Allow from o Deny from utilizamos nombres de equipos en lugar de Ips. (Estas directivas son para permitir o denegar a algunas mquinas el acceso a una parte de la web.)

Afinar Apache: persistencia


Navegar = conectar + pedir pgina web + recibir pgina web + desconectar
A
SYN SYN + ACK ACK ACK dame pgina web ACK toma pgina web (parte 1) ACK ... FIN ACK FIN ACK

... toma pgina web (parte n)

Afinar Apache: persistencia


En lugar de establecer una conexin TCP/IP para cada peticin, podemos enviar varias peticiones (por ejemplo: html + imgenes) aprovechando la misma conexin abierta.
$sudovim/etc/apache2/apache2.conf #Mximodepeticionesporconexin KeepAlive5 #Mximodesegundosdeesperaaunanuevapeticin. #Silapeticinnollegaenestetiempo,cerramoslaconexin. KeepAliveTimeout2 $sudo/etc/init.d/apache2restart

Afinar Apache: compresin


El servidor web Apache puede enviar las pginas web comprimidas, utilizando el mdulo mod_deflate (ver documentacin del mdulo para aprender cmo).

Ventaja: ahorro en el ancho de banda y descargas ms rpidas. Desventaja: mayor uso de CPU en el servidor.

Afinar Apache: servidores esttico+dinmico


Mediante los mdulos mod_rewrite y mod_proxy podemos tener dos servidores simultneamente:

Un servidor ligero (Apache compilado estticamente con los mnimos mdulos, o NginX) sirviendo contenido esttico (html, imgenes, etc). Un servidor pesado: sirviendo contenido dinmico. Recibe del servidor ligero las peticiones que ste no sirve.

Afinar Apache: servidores esttico+dinmico


Ejemplo de configuracin en el servidor Apache ligero (suponemos el ligero escuchando en el puerto 80 y el pesado escuchando en el puerto 8088):
$sudovim/etc/apache2/apache2.conf <VirtualHost*:80> ProxyPassReverse/http://%{HTTP_HOST}:8088/ RewriteEngineon RewriteCond%{REQUEST_URI}!.*\.(html|css|gif|png|jpg|pdf|gz|zip|tgz)$ RewriteRule^/(.*)http://%{HTTP_HOST}:8088/$1[P] </VirtualHost> $sudo/etc/init.d/apache2restart

Ms sobre hosts virtuales: http://httpd.apache.org/docs/2.2/vhosts/ mod_proxy y mod_rewrite: http://httpd.apache.org/docs/2.2/mod/

Afinar Apache: servidores esttico+dinmico


Segundo ejemplo de configuracin (suponemos el servidor ligero en el puerto 81 sirviendo imgenes y el pesado en el puerto 80):
$sudovim/etc/apache2/apache2.conf LoadModuleproxy_modulelibexec/apache2/mod_proxy.so LoadModuleproxy_connect_modulelibexec/apache2/mod_proxy_connect.so LoadModuleproxy_http_modulelibexec/apache2/mod_proxy_http.so ... <VirtualHost*:80> ProxyRequestsOff ProxyPreserveHostOn ProxyPass/imageshttp://0.0.0.0:81/ ProxyPassReverse/http://0.0.0.0:81/ </VirtualHost> $sudo/etc/init.d/apache2restart

Afinar MySQL: Cmo funciona?


1. Los clientes se conectan a servidor. 2. Los clientes inician autentificacin, codifican y envan peticiones, comprimen y cifran peticiones, cachean los resultados del servidor, ... 3. El servidor procesa peticiones y devuelve respuestas. 4. Las peticiones son procesadas primero por la capa de manejo, que las desencripta, valida su sintaxis, las busca en la cach, y las enva al correspondiente motor de almacenamiento. 5. Los motores de almacenamiento (MyISAM, InnoDB, Memory, ...) manejan la representacin en memoria y disco de bases de datos, tablas e ndices, as como generacin de estadsticas y algunos logs. 6. La capa de manejo escribe logs a disco, guarda y lee caches en memoria, lee logs binarios de la red, ... Los motores de almacenamiento guardan datos (tablas, logs, ...) en disco y en memoria, enva datos a otros servidores remotos, ...

Afinar MySQL: Cmo funciona?

Tablas, ndices, claves, claves externas, ...

CREATETABLE`kernelpanic`( `last_name`char(30)NOTNULL, `first_name`char(30)NOTNULL, `email`char(40)NOTNULL, `birthday`timestampdefault'', PRIMARYKEY(`email`), INDEX(`last_name`), )ENGINE=MyISAMDEFAULT CHARSET=latin1;

Afinar MySQL: Cmo funciona?


http://dev.mysql.com/doc/refman/5.0/es/storage-engines.html

Varios motores de almacenamiento de tablas. Los dos ms importantes son:

MyISAM: no transaccional, muy rpido en lectura y escritura, bajo requerimiento de espacio y memoria. InnoDB: transaccional, recuperacin de datos, concurrencia ms segura en escritura, rollbacks.

CREATETABLEnombre_tabla(definicin)ENGINE=nombre_motor; ALTERTABLEnombre_tablaENGINE=nombre_motor;

Afinar MySQL: fijar lmites


Debemos asegurarnos que mysqld no deja el sistema sin recursos:
$sudovim/etc/mysql/my.cnf ... [mysqld] ;Mximonmerodeconexionessimultneaspermitidas. ;ParasaberelmximoutilizadoejectutarlasentenciaSQL: ;SHOWSTATUSLIKE'max_used_connections'; setvariable=max_connections=500 ;Mximotiempodevidadeconexinsinenviarinformacin setvariable=wait_timeout=10 ;Mximaspeticioneserroneasantesdebloquearelcliente max_connect_errors=100 ... $sudo/etc/init.d/mysqlrestart

Afinar MySQL: peticiones lentas

Detectar las peticiones lentas:

$sudovim/etc/mysql/my.cnf ... [mysqld] logslowqueries=/var/log/mysql/mysqlslow.log long_query_time=2 logqueriesnotusingindexes ... $sudo/etc/init.d/mysqlrestart $mysqldumpslow

Cmo se ejecuta una sentencia SQL?:


EXPLAINSELECT...;

Soluciones: indexar la tabla, utilizar campos de longitud fija, vigilar joins, ...

Afinar MySQL: buffers

Ver el tamao de los buffers:

$mysqladminvariablesuusuariop|grepbuffer $mysqladminextendedstatusuusuariop|grepbuffer $mysqldverbosehelp|grepbuffer bulk_insert_buffer_size8388608 join_buffer_size131072 key_buffer_size16777216 read_buffer_size131072 sort_buffer_size2097144 ...

Aumentar el tamao de los buffers:

$sudomysqld_safekey_buffer_size=64Mtable_cache=256\ sort_buffer_size=4Mread_buffer_size=1M&

Afinar MySQL: buffers

key_buffer_size: memoria que guarda los ndices de tablas MyISAM. Debera ser suficientemente grande para contener todos los archivos *.MYI. (En servidores MySQL MyISAM dedicados entre y de la memoria total de la mquina).

mysql>SHOWSTATUSLIKE'%key_read%'; +++ |Variable_name|Value| +++ |Key_read_requests|3606100254| |Key_reads|2594030| +++ LaproporcinKey_read_requests:Key_readdeberasermayorque100:1

Afinar MySQL: buffers

innodb_buffer_pool_size: memoria que guarda los ndices y datos de tablas InnoDB. (En servidores MySQL InnoDB dedicados el 80% de la memoria total de la mquina). innodb_additional_mem_pool_size: memoria que guarda los diccionarios de datos de tablas InnoDB. Debera ser suficientemente grande para contener todos los diccionarios de datos.

Afinar MySQL: buffers

table_cache: nmero mximo de tablas abiertas en memoria por threads mysqld.

mysql>SHOWSTATUSLIKE'open%tables%'; +++ |Variable_name|Value| +++ |Open_tables|98| |Opened_tables|1513| +++ SiOpen_tables=table_cache(cachalmximo)yOpened_tables>> Open_tablesentoncessedeberaincrementartable_cache. (Open_tables:nmerodetablasactualmenteabiertas) (Opened_tables:nmerodetablasquehansidoabiertas)

Afinar MySQL: cachs


Cada vez que se procesa una peticin el servidor debe revisar la sintaxis, planificar la ejecucin, y recuperar los datos de disco y devolverlos al cliente. Podemos establecer cach para peticiones repetidas.
$sudovim/etc/mysql/my.cnf [mysqld] query_cache_limit=1M query_cache_size=32M ... $sudo/etc/init.d/mysqlrestart

Afinar MySQL: cachs

Ver y cambiar el tamao de las caches:

$mysqladminvariablesuusuariop|grepquery_cache $mysqladminextendedstatusuusuariop|grepQcache $mysqldverbosehelp|grepcache Qcache_free_blocks5216 (fragmentacindelacach) Qcache_free_memory14640664(memorialibreenlacach) Qcache_hits2581646882(peticionesservidasporlacach) Qcache_inserts360210964(peticionesmetidasenlacach) Qcache_lowmem_prunes281680433(veceslimpiarporpocamemoria) Qcache_not_cached79740667(peticionesnometidasencach) Qcache_queries_in_cache16927(peticionesactualmenteencach) Qcache_total_blocks47042(bloquesdememoriadelacach)

Coste de mantenimiento: cuidado con cach pequea (pocos aciertos) o demasiado grande (todo en cach)!

Afinar MySQL: otros ...

Valor thread_cache_size:
SHOWSTATUSLIKE'threads%';

Valor tmp_table_size:
SHOWSTATUSLIKE'created_tmp%';

Valor sort_buffer_size:
SHOWSTATUSLIKE'sort%';

Indexar las tablas (con ndices cortos):


ALTERTABLEtablaADDINDEX(columna,...);

Desfragmentar las tablas:


OPTIMIZETABLEtabla;

Afinar MySQL: herramientas

mytop: informa qu est pasando en el servidor (conexiones activas, peticiones, estadsticas, ...) http://jeremy.zawodny.com/mysql/mytop/ mysqlard: grficas a largo trmino de uso de la cach, eficiencia de las claves, ... http://gert.sos.be/en/ mysqlreport: analiza las variables de estado y aconseja mejoras http://hackmysql.com/mysqlreport

Afinar PHP: Cmo funciona?

Afinar PHP: cachear opcode


Cuando se solicita una pgina dinmica PHP: (1) lee el script, (2) lo compila a opcode, (3) lo ejecuta, y (4) lo olvida. Instalar y configurar una cach de opcode:

APC: http://pecl.php.net/package/APC eAccelerator: http://eaccelerator.net/ Xcache: http://trac.lighttpd.net/xcache/

Afinar PHP: pregenerar html


Generar repetidamente contenido dinmico es costoso. Podemos pregenerar las pginas html de salida y as servir el mximo de contenido esttico. La pregeneracin: se puede hacer una vez al da, o bien cuando el contenido asociado a una pgina cambie, etc. Todos los gestores de contenido (Wordpress, Drupal, Joomla, MediaWiki, ...) tienen caches que guardan en html las pginas solicitadas.

Afinar PHP: aumentar recursos


Valores recomendados en el fichero php.ini
$sudovim/etc/php5/apache2/php.ini ;CuantossegundosdeCPUpuedeconsumirunscript max_execution_time 30 ;Cuantossegundospuedeesperardatosdeentradaunscript max_input_time 60 ;Cuantosbytesdememoriapuedeconsumirunscriptsinsereliminado memory_limit 32M ;Cuantosbytesdedatosseguardanenbufferantesdeenviaralcliente output_buffering 4096 ;Loggearlomnimoimprescindible error_reporting=E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR $sudo/etc/init.d/apache2restart

Referencias
Nivel bsico:

Tuning LAMP systems, Part 1: Understanding the LAMP architecture http://www.ibm.com/developerworks/linux/library/l-tune-lamp-1/ Tuning LAMP systems, Part 2: Optimizing Apache and PHP http://www.ibm.com/developerworks/linux/library/l-tune-lamp-2.html Tuning LAMP systems, Part 3: Tuning your MySQL server http://www.ibm.com/developerworks/linux/library/l-tune-lamp-3.html

Nivel avanzado:

Linux Performance and Tuning Guidelines http://www.redbooks.ibm.com/redpieces/pdfs/redp4285.pdf Apache Performance Tuning http://httpd.apache.org/docs/2.2/misc/perf-tuning.html MySQL 5.1 documentation, Chapter 7: Optimization http://dev.mysql.com/doc/refman/5.1/en/optimization.html

You might also like