diumenge, 26 de desembre del 2010

Apache 2.2: Optimitzar el rendiment sota Windows

És molt probable que al teu lloc de treball s'hi utilitzi el servidor web Apache per a fer funcionar l'entorn web (intern o extern), el servidor físic on hi està instal·lat tingui com a sistema operatiu una versió del Windows, i que tot vagi força lent degut a la gran quantitat de peticions que rep el servidor. Si és així espero poder-te ajudar en aquesta entrada.

Primer de tot dir-te que el servidor Apache pot funcionar millor en un entorn Linux, degut a que les directives de configuració són majors i permeten acotar més les opcions de rendiment. Si tens la oportunitat de canviar a Linux t'ho recomano, d'altra banda no desesperis, es pot aconseguir una configuració òptima pel servidor web i obtenir un alt rendiment (és clar no com es podria aconseguir amb un Linux ;) ). Tingues en compte que la proposta de configuració que veuràs a continuació no deixa de ser una proposta, és a dir, funciona molt bé en el meu entorn de treball però és possible que hagis d'acabar afinant alguns aspectes per aconseguir un rendiment òptim en el teu.

Banc de proves

És aconsellable que tinguis uns valors de referència quan treballis en tasques d'optimització, per a veure si realment els canvis efectuats tenen un efecte positiu vers al rendiment. Com a banc de proves aconsello utilitzar una aplicació que permeti realitzar una càrrega de peticions considerable al servidor i que retorni uns resultats intel·ligibles, de manera que es puguin comparar amb els resultats de fer la mateixa càrrega de peticions un cop efectuats els canvis que possiblement millorin el rendiment. Ara no entraré en profunditat en descriure com preparar un banc de proves, espero generar una entrada al respecte en breu, però si que t'aconsello un parell d'aplicacions: Curl-Loader i JMeter. La meva preferida, la primera.

Optimització




1. Mòduls innecessaris
Desactiva tots els mòduls que no facis servir, això farà que els processos ocupin menys memòria. Els següents dos mòduls els hauries de tenir desactivats i només activar-los quan necessitis recuperar informació del servidor: mod_info i mod_status. Dins l'arxiu de configuració de l'Apache httpd.conf hi trobaràs la secció Dynamic Shared Object (DSO) Support. Cada mòdul es carrega mitjançant la directiva LoadModule. Per desactivar un mòdul només cal que lo posis els símbol # davant la línia.


2. Cache
Activar algun tipus de cache és imprescindible si es volen aconseguir rendiments òptims. Un sistema col·lapsat pot veure la seva càrrega disminuïda dràsticament activant un proxy-cache, la pròpia cache de l'Apache o un accelerador PHP. Personalment he escollit instal·lar un accelerador PHP, doncs en el meu cas la càrrega de CPU esdevenia al executar-se el procés PHP. De totes les opcions disponibles jo he instal·lat l'eAccelerator i la càrrega ha disminuït notablement.


3. Comprimir contingut retornat
Apache té un mòdul que permet comprimir la informació retornada al navegador, sempre i quant aquest ho permeti. Això permet executar la petició més ràpidament, deixar un procés Apache lliure per una altra petició abans de temps i reduir considerablement l'ampli de banda. Per contra, és possible que augmenti la CPU ja que ha de comprimir cada petició i, potser, la RAM. Activant la següent línia a l'arxiu httpd.conf si el navegador li demana a l'Apache el contingut comprimit se li retornarà comprimit:


LoadModule deflate_module modules/mod_deflate.so

A més aquest mòdul s'ha d'activar i ho pots fer mitjançant la següent directiva:

<Directory "...">
   # Activa el mòdul
   SetOutputFilter DEFLATE
   # Indica quin tipus de contingut s'ha de comprimir
   AddOutputFilterByType DEFLATE text/plain
   AddOutputFilterByType DEFLATE text/xml
   AddOutputFilterByType DEFLATE application/xhtml+xml
   AddOutputFilterByType DEFLATE text/css
   AddOutputFilterByType DEFLATE application/css
   AddOutputFilterByType DEFLATE application/xml
   AddOutputFilterByType DEFLATE image/svg+xml
   AddOutputFilterByType DEFLATE application/rss+xml
   AddOutputFilterByType DEFLATE application/atom_xml
   AddOutputFilterByType DEFLATE application/x-javascript
   AddOutputFilterByType DEFLATE application/javascript
   AddOutputFilterByType DEFLATE text/x-javascript
   AddOutputFilterByType DEFLATE text/javascript
   AddOutputFilterByType DEFLATE application/x-httpd-php
   AddOutputFilterByType DEFLATE application/x-httpd-fastphp
   AddOutputFilterByType DEFLATE application/x-httpd-eruby
   AddOutputFilterByType DEFLATE text/html
   AddOutputFilterByType DEFLATE text/htm
   # S'evita retornar contingut comprimit com imatges o vídeos
   SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary
   SetEnvIfNoCase Request_URI \.flv$ no-gzip dont-vary
</Directory>

5. httpd-mpm.conf: ThreadsPerChild, MaxRequestsPerChild, SendBufferSize

El mòdul MPM (Mòdul de Multi Processament) és el que funciona per defecte en sistemes Windows NT. El funcionament és el següent: s'executa permanentment un procés Apache que controla que s'estigui executant un altre procés Apache el qual crea fils per gestionar les peticions. Així és com funciona l'Apache als Windows NT i pocs valors de configuració hi ha per millorar el rendiment en aquest sistema operatiu (als Linux les directrius de configuració són més extenses i específiques per a millorar el rendiment dels processos Apache i els seus fils). Jo proposo les següents modificacions, que faran que el teu servidor processi més volum de peticions. Has de vigilar que el hardware pugui processar les peticions, jugar amb els valors fins a trobar un rendiment estable:


  • ThreadsPerChild: Indica el número de fils que es crearan al iniciar el servidor. Personalment utilitzo un valor de 1900, força alt ja que tenim moltes peticions i el hardware aguanta. Aquest valor també està limitat pel sistema operatiu, depenent del valor que necessitis podria ser que hagis de tocar la configuració del sistema operatiu per a poder indicar un valor realment alt.
  • MaxRequestsPerChild: 0. Aquest valor indica cada quantes peticions processades el servidor web s'ha de tancar i tornar a obrir per alliberar recursos. Tinc posat que no acabi mai però en realitat hauria de ser un valor molt aproximat al número de peticions diàries entre el número de processos Apache (1 en el cas de Windows NT), de manera que només es torna a iniciar una sola vegada al dia evitant talls de connexions innecessaris. En el meu cas el servidor Apache no consumeix massa memòria i per això està el valor 0.
  • SendBufferSize: Aquest valor augmenta la velocitat de transmissió. Un valor correcte és el suficientment alt com per a que hi càpiga el contingut de resposta d'una pàgina web, així s'evita bloquejar i retornar la informació en diferents vegades. Estranyament per un valor de 1460 a mi em funciona molt bé. Aquest buffer també pot venir limitat pel sistema operatiu.



Espero que aquestes línies t'ajudin a millorar el rendiment del teu entorn de treball web!

Referències

http://httpd.apache.org/docs/2.2/
http://en.wikipedia.org/wiki/List_of_PHP_accelerators
http://sourceforge.net/projects/curl-loader/
http://www.softwareqatest.com/qatweb1.html

Cap comentari:

Publica un comentari a l'entrada