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

dissabte, 25 de desembre del 2010

Android : Modificar arxiu hosts

Molt bé, anem a veure com configurar un emulador Android per a navegar a la nostra intranet. Aquesta modificació, per exemple, ens serà molt útil si volem comprovar com es veu el web que estem desenvolupant en un terminal Android.

Preparació de l'entorn de treball 

  1. Descarregar i instal·lar l'Android SDK: El trobaràs en el següent enllaç: http://developer.android.com/sdk/index.html. Instal·la la versió de l'API que necessitis.
  2. Crear un Dispositiu Virtual Android: Un dispositiu virtual Android es pot entendre com una màquina virtual on hi ha instal·lat el sistema operatiu Android. Obre un terminal i accedeix al directori tools dins del directori d'instal·lació de l'SDK. Amb la següent comanda podràs crear el dispositiu: android create avd -f -n android1.5 -t android-3 -p c:\. El paràmetre -t indica la versió del sistema operatiu a instal·lar (segons la versió de l'API que hagis instal·lat). Per veure el número o identificador que has d'utilitzar executa la següent comanda i veuràs la llista de targets disponibles: android list targets.
  3. Obrir el dispositiu amb l'emulador Android: Al mateix directori trobaràs l'eina emulator que et permetrà obrir el dispositiu creat al pas anterior. Executa la següent comanda per fer córrer un Android al teu ordinador: emulator -avd android1.5 -partition-size 128. Molt important el paràmetre -partition-size per evitar problemes de falta de memòria.

Modificar arxiu hosts al dispositiu

Un cop l'emulador està executant l'Android amb la versió que necessitem ja se li pot modificar l'arxiu hosts. Ara has de sortir del directori tools i entrar al directori platform-tools. Hi trobaràs l'eina adb (Android Debug Bridge) que et permetrà interactuar amb el dispositiu.

Executar les següents comandes:

  1. adb devices: Llista els dispositius virtuals o reals accessibles. Necessites executar la comanda per saber l'identificador del dispositiu.
  2. adb remount: Permet escriure al dispositiu, d'altra forma apareixerà un error de lectura/escriptura.
  3. adb -s emulator-5554 push C:\hosts /etc/hosts: Sobreescriu l'arxiu /etc/hosts del dispositiu virtual emulator-5554 per l'arxiu hosts situat a C:\ de l'ordinador. Pots utilitzar en comptes de push el paràmetre pull amb els directoris intercanviats per obtenir l'arxiu hosts del dispositiu: adb -s emulator-5554 pull /etc/hosts C:\hosts.

Ja ho tens! Amb aquests passos pots modificar l'arxiu hosts per fer comprovacions en plataformes mòbils. També pots utilitzar les comandes anteriors per a modificar altres arxius del dispositiu.

Referències

http://developer.android.com/sdk/index.html
http://developer.android.com/guide/developing/tools/adb.html
http://developer.android.com/guide/developing/tools/avd.html