lunes, 23 de septiembre de 2013

passenger en un VPS con memoria limitada

Administrando un servidor web quise instalar redmine, para lo cual se necesita ruby, gems, etc.
Hasta ahi todo bien, en internet todo esta perfectamente documentado; sin embargo, al querer levantar el servidor con el modulo de passenger para apache tuve un problema (#passenger-install-apache2-module); pues al querer instalar el modulo salia el siguiente error:
#g++ -I.. -fPIC -g -DPASSENGER_DEBUG -DLINUX=2 -D_REENTRANT -
D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE -I/usr/
include/apr-0 -pipe -I/usr/include/xmltok -I/usr/include/openssl -Wall
-g -I/usr/include/apache2 -D_REENTRANT -Wall -g -I/usr/local/include -
c Hooks.cpp
virtual memory exhausted: Cannot allocate memory
rake aborted! 
Del mensaje de error vemos que el servidor se quedo sin memoria, ante lo cual, encontre la solucion de usar distcc. Es un programa que permite hacer la compilacion distribuida entre varias PC de una manera sencilla. Instale la aplicacion en el VPS y en mi PC. Luego de arrancar el daemon en ambos lados (#distccd --daemon --allow IP) configure las siguientes variables de entorno:
#export DISTCC_LOG=/tmp/distcc.log
#export DISTCC_DEBUG=1
#export DISTCC_DIR=/etc/distcc
#export DISTCC_BACKOFF_PERIOD=0

Finalmente para compilar:
#CC="distcc gcc" CXX="distcc g++"  passenger-install-apache2-module

Las dos primeras variables de entorno son para activar el debug y que el log sea el archivo indicado. La siguiente es el path en que se buscara el archivo hosts (por defecto es .distcc) que indica los hosts a los que se va a conectar. La ultima variable esta referida al funcionamiento de los PCs que ayudan a la compilacion (aka servidores). Cuando se compila, en caso de fallar alguna compilacion (por cualquier motivo) ese servidor entra a un periodo de "backoff" durante el cual no se le enviara ningun otro archivo para que compile durante un tiempo de 60 segundos. En mi caso eso no era deseable pues el VPS volaba con la memoria y era vital que la compilacion sea totalmente remota; que ningun archivo sea compilado de manera local; entonces desactive el tiempo de backoff colocandolo en cero.
Adicionalmente, para lograr este mismo cometido el archivo hosts (/etc/distcc/hosts) coloque lo siguiente:

200.65.99.104 localhost/1

Es importante el orden en que se coloquen los hosts, pues el primero en estar en la lista tiene mayor relevancia, así que se debería colocar en primer lugar a los servidores mas rápidos. Ademas, a localhost se le adiciono "/1" que indica que a lo sumo tendrá un solo proceso corriendo a la vez, para que no se sobrecargue mi VPS y se caiga la compilación. Leí en algunos foros que se podía colocar el valor de cero, para que se asigne cero procesos (o sea que no se asigne nada) al VPS; sin embargo el distcc retornaba error; parece que en versiones anterior si aceptaba el valor de cero, pero actualmente no lo hace.

Una ultima acotación  que es de vital importancia: se debe verificar las versiones de gcc que se utilicen en todos los puntos de la compilación distribuida, pues los .so que genera una versión no son necesariamente compatibles con otra. Esto me llevo a tener un error que hacia que la compilación se caiga; basto con cambiar la versión de gcc y la compilación, luego de mucho esfuerzo, se completo con éxito.

Obviamente que el log y el debug son opcionales para una compilación normal, pero obligatorias en caso que falle y se quiera ver en el error.

No olvidar de abrir temporalmente el firewall, hacer el NATeo correspondiente y de esperar un poco, que en mi caso fue bastante tiempo.

Documentación que encontre util:
http://distcc.googlecode.com/svn/trunk/doc/web/man/distcc_1.html

No hay comentarios:

Publicar un comentario