Optimización de Apache para bajo consumo de memoria

Hoy vamos a ver como bajar el consumo de memoria de Apache sin que se vea afectado el rendimiento en servidores dedicados y servidores dedicados virtuales (VPS).
Como siempre, el entorno de servidor es LAMP.
Para efectuar la optimización básicamente se requieren 2 cosas, manejo básico de consola y conocimientos básicos de matemáticas.

  1. Igresar al servidor mediante SSH como root.
  2. Correr el comando “top”, esto va a devolvernos una lista acotada de los procesos activos.
  3. Tomar nota del valor RES correspondiente a apache mas alto de la lista. Cuidado aqui! Tener en cuenta que el valor puede estar expresado en bytes o en megabytes, si esta expresado en megabytes, se marcará con una letra “m” luego del valor.
  4. Salir del “top” presionando la tecla “Q”
  5. Detener el servicio apache. El comando puede variar según el OS pero por lo general podemos detenerlo con “service httpd stop”.
  6. Una vez se haya detenido, ejecutar “free -m”. Esto nos va a devolver información relacionada a la cantidad de memoria en uso y disponible.
  7. Tomar nota de la cantidad de memoria utilizada o “used”.
  8. En caso de un VPS, averiguar la cantidad de memoria “garantida” de que disponemos. Esta será la memoria “real”.
  9. Restar la memoria utilizada (used) de la memoria real. Esto nos va a devolver el pool de memoria libre que nos queda para Apache.
  10. Multiplica el pool de memoria libre por 0.8 para obtener un promedio de memoria libre y reservar un 20% para momentos en que se requiera inesperadamente.
  11. Divide el resultado de la operación anterior por el valor RES mas alto que tomamos en el punto 3. Esta operación va a devolver la cantidad de “MaxClients” que debemos utilizar.
  12. Abrir el archivo de configuración de Apache con cualquier editor de texto plano (de preferencia de consola).
  13. Alusta el valor de “MaxClients” del archivo con el valor que hemmos calculado.
  14. Desactivar “Keepalive” (Keepalive Off).  Apache puede manejar mas peticiones manteniendo Keepalive On, pero con un consumo de memoria mas intensivo. Si no nos reservamos el 20% de memoria del paso 10, debemos dejarlo en “On”.
  15. Si dejamos Keepalive On debemos ajustar KeepAliveTimeout el menor valor posible para prevenir que las conexiones se cuelguen, si se experimeta alta latencia, fijar el valor entre 2 y 5 segundos máximo.
  16. Establecer el “TimeOut” a un valor razonable. Escoje un valor en que no se interrumpa la transferencia de datos , pero que sea lo suficientemente bajo como para que no queden conexiones inactivas abiertas por mucho tiempo  (entre 10 y 30 segundos de “TimeOut” es razonable).
  17. MaxKeepAliveRequests debe ser igual a la mayor cantidad de objetos que tiene en una página. Si no lo sabemos, entre 70 y 200 es bastante razonable.
  18. MinSpareServer  debe estar entre el 10 y 25% de MaxClients.
  19. MaxSpareServer  debe estar entre el 25 y 50% de MaxClients.
  20. StartServer dee ser igual a MinSpareServers o MaxSpareServers. Este es solo el valor de la cantidad de servidores que deben iniciarse con apache y estar disponibles desde el principio.
  21. MaxRequestsPerChild debe establecerse entre 500 y 10000. Establecer este valor en 0 se traducirá en procesos hijos que nunca expiran y que eventualmente aumentan el consumo de memoria sin provecho alguno.
  22. Luego de realizados todos los cambios guardamos el archivo y reiniciamos Apache (ej: service httpd start)

Continúa leyendo Optimización de Apache para bajo consumo de memoria

Implementación simple de Zend_Search_Lucene

Zend_Search_Lucene es un porte o “port” de PHP del popular motor de búsqueda Apache Lucene escrito en Java. También es una parte importante de Zend Framework. Algunos dicen que es demasiado lento para ser utilizado en aplicaciones web robustas y recomiendan alternativas más rápidas, como “Sphinx”, pero ese no es el tema de hoy. En este post voy a mostrar una implementación básica de Zend_Search_Lucene que me ha funcionado bien hasta ahora para sitios web de mediano porte. Hay dos tareas principales  que tener en cuenta:

  • Crear un indice y actualizarlo de manera periódica.
  • Búscar en el índice utilizando un potente lenguaje de consultas.

Continúa leyendo Implementación simple de Zend_Search_Lucene

Zend Framework, directorio “public” en hosting compartido

Una pequeño tip para los que necesitan trabajar con Zend framework sobre servicios de hosting “compartido”.
La estructura típica de un proyecto de ZF es similar a la siguiente

miproyecto/
   application/
      controllers/
      views/
         scripts/
   library/
   public/
   tests/

El directorio “public” contiene todos los archivos que deberían ser accesibles por el servidor web y por lo tanto, el “document root” o “directorio raiz” debería ser el mismo directorio “public”.
Lamentablemente la mayoría de los proveedores de hosting compartido no ofrecen la característica de poder cambiar dicha “raiz” del servicio y de hecho el nivel mas “alto” al que podemos acceder en la mayoría de los casos es la misma “raiz”, lo que impide poder alojar los directorios “privados” de nuestra aplicación ZF fuera de la “raiz”.

Continúa leyendo Zend Framework, directorio “public” en hosting compartido

Instalando eAccelerator en Debian Lenny

 

eAccelerator es un optimizador y acelerador libre para PHP, que incrementa la performance de PHP cacheando el “bytecode” , lo que elimina la carga de compilación casi completamente y por ende hace mas rápida la ejecución  (según el sitio oficial, hasta 10 veces!).

Actualmente existen varias herramientas libres para realizar esta tarea, pero pesonalmente me decanté por eAccelertator luego de ver algunos benchmarks y leer algunas reseñas. Si googlean un poco “eAccelerator vs” van a encontrar bastante información y comparaciones con otras herramientas y verán que eAccelerator en la gran mayoría de los casos es superior al resto.

Continúa leyendo Instalando eAccelerator en Debian Lenny

Eliminar Kernels antiguos en Fedora

De todas las distribuciones que he probado, probablemente Fedora es en la que dicha tarea se realiza mas fácil y limpiamente, basta con correr un simple comando y Fedora eliminará los kernels en desuso y sus correspondientes entradas en el Grub.

Primero, si no sabemos que Kernels tenemos instalados, podemos listarlos con

rpm -q kernel

luego de tener la lista procedemos a eliminar los que queramos con el comando

rpm -e kernel-version

*Donde “kernel-version” la versión que deseamos desinstalar, ej : kernel-2.6.41.4-1.fc15.x86_64

Continúa leyendo Eliminar Kernels antiguos en Fedora

[Solución] Problema con Netbeans 7 y Gnome 3 (gnome shell)

Hace poco decidí cambiar mi entrono de escritorio de compiz-fusion (que hace un par de años vengo utilizando) a gnome3/gnome shell.

Luego de sortear varios problemas que acarréo la migración, me encontre con un desfase en los menus y pop-ups  de Netbeans 7 lo que me llevó a buscar y encontrar la solución que voy a compartir. Continúa leyendo [Solución] Problema con Netbeans 7 y Gnome 3 (gnome shell)

Traits en PHP 5.4

Php.net ha publicado la primer alpha de PHP 5.4 que promete muchas mejoras de rendimiento y nuevas funcionalidades, entre ellas la construcción de “Traits”.

Básicamente un “Trait” es una colección de metodos destinados a utilizarse en diferentes clases, sin duda un modo elegante de re-utilización de código evitando la reiteración del mismo.

Continúa leyendo Traits en PHP 5.4

Taller de Agile Development – Ruby on rails & Scrum


Disertantes: Gabriel Chertok, Pablo Ifran, Gianfranco Zas, Ing. Martin Cabrera, Ing. Alejandro Mateo,Gabriel Ledesma
Fecha: 6 de julio de 2011, de 19:00 a 22:00
Lugar: Auditorio Centro, Universidad ORT Uruguay, Cuareim 1451
Objetivo: Presentar los nuevos paradigmas sobre el desarrollo de software basado en proyectos enfocados a la Web, cambiantes, dinámicos y ágiles

Continúa leyendo Taller de Agile Development – Ruby on rails & Scrum