Professional Documents
Culture Documents
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
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.
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
https://addons.mozilla.org/es-ES/firefox/addon/966
MyBench
http://jeremy.zawodny.com/mysql/mybench/
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.
Optimizar el cdigo del programa PHP. Optimizar la estructura de tablas y las consultas al servidor de BBDD.
En el cliente:
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.
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
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.
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.
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.
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.
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
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
Ventaja: ahorro en el ancho de banda y descargas ms rpidas. Desventaja: mayor uso de CPU en el servidor.
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.
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;
Soluciones: indexar la tabla, utilizar campos de longitud fija, vigilar joins, ...
$sudomysqld_safekey_buffer_size=64Mtable_cache=256\ sort_buffer_size=4Mread_buffer_size=1M&
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).
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.
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)
$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)!
Valor thread_cache_size:
SHOWSTATUSLIKE'threads%';
Valor tmp_table_size:
SHOWSTATUSLIKE'created_tmp%';
Valor sort_buffer_size:
SHOWSTATUSLIKE'sort%';
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
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