e-Accelerator para PHP

Cuando trabajamos con servidores de aplicaciones PHP la estrategia de implantación debe prestar especial interés a los siguientes factores:

  • Por un lado la cantidad de memoria RAM que consumirá cada proceso del servidor Web que se encargará de atender a los clientes. Si nuestro servidor está configurado con demasiados módulos, cada proceso del servidor Web consumirá mucha RAM. Esto supondrá un problema ante altas cargas de trabajo. Pensar que un proceso de Apache sin optimizar puede consumir sobre los 50M de RAM de nuestro servidor.
  • Y por otro lado se debe considerar el tiempo de respuesta del servidor ante cada petición. Un tiempo de respuesta entre 1 y 3 segundos es algo aceptable para interactuar con el usuario. Lo que supere los tres segundos dará la impresión al usuario que el equipo está muy sobrecargado y abandonará la página.

Mientras que para el primer factor la única solución de la que disponemos es aligerar nuestro servidor Web de módulos innecesarios o cambiar por otro más ligero y eficiente en el consumo de memoria, para mejorar el segundo factor tendremos varias alternativas:
  1. Una primera alternativa será usar cachés transparentes inversas configuradas para servir imágenes y los contenidos estáticos, liberando así a nuestro servidor Web de esta carga de trabajo.
  2. Lo siguiente que deberíamos revisar es la configuración multiproceso de nuestro servidor web. Un servidor web Apache 2.x puede ser configurado para manejar las peticiones de diferente forma, desde el punto de vista en que son creados y manejados los subprocesos necesarios que atienden a cada cliente conectado a este

El primer tipo de gestión multiproceso es Prefork:
  • Apache inicia varios subprocesos y cada petición es atendida por uno de estos; cuando termina con esta petición este subproceso podría atender a otro cliente o ser terminado, según al valor de MaxRequestsPer-Child.
  • Es el modo más estable, ya que un error crítico solo afectaría a una petición. Este es el único modo en que se pueden usar módulos / extensiones que no sean Thread-Safe
  • Requiere más recursos (Memoria RAM y CPU) para atender cierto número de peticiones simultaneas, respecto a otras configuraciones. Esto limita drásticamente la escabilidad del servidor
  • Favorece el uso intensivo de PHP. Los aceleradores de PHP no son Thread-Safe, pero al usarlos junto a Prefork podemos justificar el mayor uso de php (o páginas sin ningún tipo de caché, aparte del acelerador en sí).
  • Prefork es la configuración predeterminada en la mayoría de instalaciones.

El segundo tipo es la gestión de procesos que implementa Apache 2.X es Worker:
  • Apache inicia varios subprocesos y estos a su vez mantienen varios hilos (threads) con los cuales procesaran las peticiones. Un subproceso proceso puede atender a varios clientes a la vez, según se indique en ThreadsPerChild.
  • El hecho de que un subproceso pueda manejar varias peticiones a la vez, hace que se requieran menos recursos para atender a cierto número de peticiones simultaneas.
  • El inconveniente de Worker está en que requiere que todos los módulos/extensiones que se vayan a usar sean Thread-Safe, limitando el tipo de procesamiento que se puede llevar a cabo con el servidor web
  • Un fallo crítico (que el subproceso termine repentinamente) afecta a varias peticiones, por eso se requiere que se cumpla el Thread-Safe
  • Ya que no se pueden usar aceleradores de PHP junto a Worker, el uso intensivo de este debería ser evitado con algún tipo de sistema de caché adicional
  • Worker puede ser una buena solución para un servidor de contenido estático.
  • Worker solo está disponible desde Apache 2.x.

Usar aceleradores php como eAccelerator o XCache también debería considerarse como alternativa para optimizar el tiempo de respuesta. Estos aceleradores se integran con nuestro servidor web y el intérprete de php de manera que cuando llega una petición, el fichero PHP se precompila, para que las siguientes peticiones del mismo fichero php no sea necesario volver a recompilar, ganando unos ciclos de CPU a cada petición.
Para poder instalarlo eAccelarator debemos tener instalado el autoconf, y php-devel. Luego ejecutar:
  • Descargar eAccelerator y descomprimir
    cd /opt/software
    wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.2.tar.bz2

    cd /opt
    tar xjvf /opt/software/eaccelerator-0.9.5.2.tar.bz2
  • Compilar eAccelarator
    cd /opt/eaccelerator-0.9.5.2/
    phpize
    ./configure --enable-eaccelerator=shared
    make
    make install
  • Copiar el módulo al directorio de módulos de PHP
    cp /opt/eaccelerator-0.9.5.3/modules/eaccelerator.* \
    /usr/local/lib/php/extensions
  • Y activar el módulo, editando /etc/php.ini, y añadiendo en la zona de las extensiones la línea:
    extension=eaccelerator.so

Reiniciar nuestro servidor Web para aplicar los cambios. Podemos comprobar también si estamos usando algún tipo de acelerador PHP, ejecutando:
php -v

La foto la he sacado del album de Adam Foster en Flickr.

No hay comentarios: