tuning lamp
Post on 18-Jul-2015
374 Views
Preview:
TRANSCRIPT
Afinando ...
Copyleft Alejandro Castn Salinas http://www.xtec.net/~acastan/textos/ Creative Commons by-nc-sa 2.5
Afinando LAMPRealizar 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: ApacheApache 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: MySQLToman 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 Smackhttp://vegan.net/tony/supersmack/
MyBenchhttp://jeremy.zawodny.com/mysql/mybench/
Medir el rendimiento: ms ...
Easy system monitoring with SARhttp://www.ibm.com/developerworks/aix/library/au-unix-perfmonsar.html
Expose Web performance problems with the RRDtoolhttp://www.ibm.com/developerworks/edu/dw-esdd-webperfrrd-i.html
Monitoring Virtual Memory with vmstathttp://www.linuxjournal.com/article/8178
Afinar el hardwareNo 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 aplicacionesNo 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 - atimeCada 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 - hdparmPermite 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: NFSSi 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: MPMLos 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 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 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 ficherosUn ejemplo:$sudovim/etc/apache2/apache2.conf #Opcionesparaeldirectoriorazysubdirectorios #Ignoramoslosficheros.htaccessynocomprobamosenlacessimblicos AllowOverrideNone OptionsFollowSymLinks #Opcionesparalosdirectoriosdelosusuarios(*esuncomodn) #Comprobamosquelosusuariosnohayanpuestoenlacessimblicos OptionsFollowSymLinks #Opcionesadicionalesparapepito.Antesestabanenun.htaccess AuthUserFile/home/pepito/.htpassword $sudo/etc/init.d/apache2restart
Afinar Apache: DNS inversoApache 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 inversoLo 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: persistenciaNavegar = conectar + pedir pgina web + recibir pgina web + desconectarASYN SYN + ACK ACK ACK dame pgina web ACK toma pgina web (parte 1) ACK ... FIN ACK FIN ACK
B
A
... toma pgina web (parte n)
B
Afinar Apache: persistenciaEn 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: compresinEl 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+dinmicoMediante 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+dinmicoEjemplo 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 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] $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+dinmicoSegundo 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 ... ProxyRequestsOff ProxyPreserveHostOn ProxyPass/imageshttp://0.0.0.0:81/ ProxyPassReverse/http://0.0.0.0:81/ $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 lmitesDebemos 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: cachsCada 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 opcodeCuando 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 htmlGenerar 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 recursosValores 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
ReferenciasNivel 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
top related