El Grid computing aprovecha un conjunto heterogéneos de recursos de forma conjunta. Así, una empresa podría utilizar, en segundo plano, todas las CPU de sus empleados para realizar cálculos en lugar de tener un centro de cálculo específico o podría usar el espacio libre en los discos para tener un servidor de datos distribuido y altamente tolerante a fallos. Proyectos como BOINC son ejemplos de computación distribuida heterogénea.
Sin embargo, para utilizar todos estos recursos, normalmente hace falta una planificación e infraestructura. En casos como BOINC es preciso darte de alta, instalar un programa, etc…
Hoy, os propongo un juego (un katta si queréis), ¡aprovecharnos del poder de cómputo de todos los ordenadores de todos nuestros internautas!. El juego se llama Anonymous Grid Computing.
Introducción
Como veremos, en unas pocas líneas de código podemos acceder a una ingente cantidad de potencia de cálculo. El esquema es válido en un entorno real pues el único requisito es tener una conexión a internet. Todo los ordenadores que una empresa internacional posee en todo el mundo, podrían ser usados fácilmente con el mecanismo que propongo. El enfoque “anonymous” que le he dado, es porque a los informáticos nos suele gustar este tipo de juegos (nosotros ser el gato que juega con el ratón), pero en la práctica, un uso “no consentido” tendría implicaciones morales, legales y técnicas que no pretendo analizar. Por eso lo he llamado “juego”.
Computación distribuida
No todos los problemas son adecuados para una computación distribuida, no es mi intención comentar el tema, puedes leer las referencias si quieres profundizar, pero básicamente, aquellos problemas que pueden ser divididos en pequeños problemas, resolverlos de forma independiente y luego juntarlos, son susceptibles de ser abordados mediante computación distribuida. Algunos ejemplos:
Renderizar las imágenes de una película de animación 3D.
Simular un experimento muchas veces para contrastar posibilidades (eg. formación de galaxias).
Búsqueda exhaustiva de soluciones (eg. romper por fuerza bruta claves de datos crifrados).
En nuestro caso, nos da igual lo que calculemos, lo interesante es que podremos lanzar en segundo plano (hipotéticamente sin que se de cuenta el internauta) los cálculos en todas las CPU de nuestros internautas. Sí, si un navegante tiene un ordenador con 8 cores ¡usaremos sus 8 cores!.
Ejemplo de cálculo
Como digo no es importante si no te queda muy claro este punto, solo voy a describir el problema de ejemplo de cálculo que vamos a solucionar. Podría ser cualquier otro, pero aquí, vamos a calcular Pi, además, de una manera muy ineficiente para hacer de forma sencilla, un uso masivo del procesador.
El método de Montecarlo es famoso por permitir, de forma fácil, encontrar soluciones aproximadas a problemas muy complejos. Solo explicaré nuestro problema, en las referencias encontrarás datos concretos sobre el método.
Si tenemos un cuadrado de 1×1 metros e inscrito un círculo (de radio medio metro) al que lanzamos dardos de forma completamente aleatoria, los dardos cubrirán todo nuestro cuadrado, algunos habrán caído dentro del círculo y otro fuera. Una simple regla de tres, nos dirá el valor de Pi. De forma similar, si en lugar de todo un círculo, unicamente inscribimos en nuestro cuadrado un cuarto de círculo, obtendremos la cuarta parte de Pi.
Resumiendo, que si T es el número total de dardos lanzados y H (de hit) es el número de dardos que caen dentro del cuarto de circunferencia, entonces Pi = 4 H / T.
Si X e Y son las posiciones aleatorias dentro de nuestro cuadrado de 1×1 metros, estará dentro del cuarto de circunferencia si es X2 + Y2 < 1.
Solución
La solución consistirá en la parte del servidor que acumulará los datos generados por los ingenuos internautas (que están pensando en comprarse un ordenador más potente porque las páginas web van un poco lentas; risas). Luego mostraremos la página web que realiza el trabajo en paralelo.
Servidor
En un escenario real, la carga de datos debería ser transaccional, por simplificar usaré un sencillo archivo de texto que almacenará e irá sumando los valores T y H que nos envían los clientes. Además, devolverá al cliente el valor actual de Pi aproximado, ésto no hace falta, pero así nosotros vemos como evoluciona el cálculo.
Bueno, el código es un sencillo script en Perl que no requiere de explicación (para cualquier duda usa los comentarios):
Cliente
Para conseguir la paralelización en el navegador, usaremos la API Web Workers que ya está disponible en Firefox, Safari, Chrome y como no en IE no.
Obviamente, si queremos que nuestro proceso sea transparente, ni pediremos al usuario que nos entregue hilos de ejecución ni le mostraremos la evolución del proceso, pero así nosotros podemos verlo. La página siguiente tampoco tiene mucha miga y tampoco requiere explicación (para cualquier duda usa los comentarios):
El script que realiza el trabajo y del que se crean tantos hilos como sea preciso, también es sumamente sencillo, aquí está:
Ejemplo de uso
Para verlo en acción puedes ir a la página anonymousGridComputing.html que he dejado funcionando. Allí, le puedes indicar cuantos hilos quieres dejar funcionando. En la imagen, puedes ver un ejemplo:
Estimación de la capacidad
La mejor forma de estimar la carga es conociendo el número de usuarios únicos que visitan nuestros sitios y el tiempo medio que permanecen en ellos. Por ejemplo, la página de El Corte Inglés tiene unas 270.000 visitas al día con una permanencia media de 5 minutos, eso hacen 1.350.000 minutos de computación por día. Es decir, el equivalente a 1.350.000 / 1440 = 937 equipos. Como centro de cálculo, no está nada mal. Lo más difícil sería estimar la capacidad media de cada equipo, pero podemos tener un factor aproximado incluso con las pocas líneas que hemos escrito, porque cada 5 minutos nos envían el número de eventos generados (en el valor T) así, el mismo valor T es un indicador de la potencia de cálculo de cada máquina en el momento que nos envía cada resultado. De ahí, a guardar una cookie para identificar cada equipo hay un paso.
Conclusión
De una forma muy sencilla, podemos utilizar toda una heterogénea infraestructura para realizar cálculos de algún tipo sin necesidad de realizar ninguna configuración ni preparación previa (nada más que un navegador funcionando). La naturaleza de JavaScript además permite realizar prototipos de forma rápida y cómoda. Las mejoras en los intérpretes también hacen que usar JavaScript no conlleve un rendimiento desastroso aunque en casos reales, la utilización de un applet con código Java optimizado puede ser recomendable (ver comparativa en las referencias).
En todo caso, ¡un ejercicio muy divertido!.
Más información | Grid computing, BOINC, Computación distribuida.
Método de Montecarlo.
Más información | W3C Web Workers.
Más información | Comparativa rendimiento JavaScript frente a Java.