Despacho Mejorado de Cálculo
Científico Distribuido en Redes de Computadoras
No Dedicadas Usando PVM
Dr. Ing. Carlos
López Vázquez
Ing.
Antonio López Arredondo
Bach.
Sergio Nesmachnow Cánovas
Colaboraron:
Ing.
Nelson Calero
Bach.
Felipe Mendívil
Informe
final
Octubre
1999
Financiado por la Comisión
Sectorial de Investigación Científica
Universidad de la República
Índice
Capítulo 1: Introducción
*
1.1 Procesamiento paralelo y distribuido *
1.2 Introducción a los objetivos generales del proyecto *
1.3 Objetivos específicos del proyecto *
1.4 Especificación de las preguntas que planteó responder
el proyecto *
1.5 Actividades específicas *
Capítulo 2: Procesamiento Paralelo
en Redes de Computadoras *
2.1 Computación Paralela *
2.2 Tipos de Máquinas Paralelas *
2.2.1 - Memoria Compartida *
2.2.2 - Memoria Distribuida *
2.2.3 - Redes de Computadoras *
2.3 Paradigmas de Programación Paralela *
2.4 Antecedentes en el Centro de Cálculo *
2.4.1 - Creación de máquinas paralelas *
2.4.2 - Desarrollo de Aplicaciones Distribuidas *
2.4.3 - Mejoras de Herramientas de Desarrollo *
2.5 Conclusiones *
Capítulo 3: El problema del Balance
de Cargas *
3.1 Balance de cargas en una red *
3.2 Parámetros relevantes en la determinación de la carga
de una ET *
3.3 Análisis del consumo de CPU como factor preponderante en la
demora de ejecución. *
3.4 Otros parámetros de carga *
Capítulo 4: Análisis y modelización
de datos históricos de carga *
4.1 Recolección de datos de carga *
4.2 Análisis y modelización de datos *
4.2.1 - Presentación *
4.2.2 - Análisis individual de datos para cada componente de la
red
*
4.2.3 - Análisis de correlaciones entre parámetros de carga.
*
4.2.4 - Análisis de correlaciones entre valores de carga de diferentes
equipos de la red. *
4.3 Métodos de predicción basados en Series Temporales
*
4.3.1 - Introducción *
4.3.2 - Métodos determinísticos lineales *
4.3.3 - Métodos no lineales (basados en redes neuronales artificiales)
*
Capítulo 5: Replicación de Datos
de Carga *
5.1 Necesidad de replicar la carga de la red *
5.2 Universo de parámetros factibles de ser replicados *
5.3 Elección de parámetros a replicar *
5.4 Proceso de réplica *
5.5 Réplica de CPU *
5.5.1 - Introducción *
5.5.2 - Lista de procesos *
5.5.3 - Único proceso *
5.6 Réplica de disco *
5.7 Réplica de red *
5.8 Conclusiones *
Capítulo 6: Métodos de predicción
de la serie temporal de datos de carga *
6.1 Introducción *
6.2 Método de predicción naive *
6.3 Método de predicción basado en el Método de
Mínimos Cuadrados *
6.4 Métodos basados en Redes Neuronales Artificiales (ANN).
*
6.4.1 - Caso univariado *
6.4.2 - Caso multivariado *
6.4.3 - Conclusiones *
6.5 Pruebas de los algoritmos de predicción *
Capítulo 7: El desempeño de
los diferentes métodos de despacho *
7.1 Nuevos algoritmos de despacho de tareas *
7.1.1 - Introducción *
7.1.2 - Descripción de los nuevos algoritmos de despacho *
7.1.3 - Integración al sistema PVM *
7.2 Experimento de evaluación del desempeño de los nuevos
métodos de despacho *
7.2.1 - Introducción *
7.2.2 - Ensayo preliminar *
7.2.3 - Ensayo de fuerza *
Capítulo 8: Conclusiones y trabajo
futuro *
8.1 Conclusiones *
8.2 Trabajo futuro *
Bibliografía *
Anexo I
- Cronograma de actividades
Anexo II -
Towards Proactive Network Load Management For Parallel Distributed Programming
Anexo III
- Artificial Replication of Network Load Environment for Distributed Algorithms
Comparison
Resumen
El presente trabajo propone la investigación e implementación de nuevas estrategias de despacho de tareas distribuidas, con el objetivo de mejorar el desempeño global de programas desarrollados bajo el paradigma de ejecución paralela. Las nuevas estrategias se basan en optimizar el balance de cargas sobre la red utilizada usando estimaciones sobre la carga futura de los nodos del sistema.El software actualmente disponible para manejar aplicaciones distribuidas no se preocupa en determinar la carga futura de las computadoras de la red. Simplemente despacha las tareas asignándolas a una CPU libre (en el caso de una red dedicada) o a la menos cargada (en redes no dedicadas).
Nuestra propuesta consiste en mejorar las estrategias estándar de despacho de tareas provistas por los lenguajes y bibliotecas para programación paralela, implementando nuevos algoritmos de despacho. Los nuevos algoritmos serán capaces de escoger la Estación de Trabajo (ET) más apropiada para despachar una tarea luego de predecir la carga de los componentes de la red, utilizando información de los datos de carga y técnicas estadísticas de predicción. Las aplicaciones distribuidas existentes podrán tomar ventaja de este nuevo servicio sin modificación alguna, salvo una recompilación.
Una comparación justa entre los diferentes algoritmos de despacho de tareas solamente puede realizarse sobre las mismas condiciones de carga externa. Para realizar la comparación, fue diseñado un programa que permite replicar una carga histórica arbitraria mientras se ejecutan las aplicaciones utilizando las diferentes estrategias de despacho. Los nuevos algoritmos fueron ensayados y comparados en ese entorno para cuantificar la mejora de desempeño sobre las estrategias de despacho disponibles. El desempeño global del sistema desarrollado fue evaluado con modelos numéricos diseñados en el Centro de Cálculo, resultando en mejoras del orden del 6% en tiempo de ejecución en relación con el tiempo requerido por la versión estándar de PVM.
El proyecto aquí descrito se conecta con otros esfuerzos realizados en el Centro de Cálculo orientados a difundir y simplificar el uso de las técnicas de programación paralela y distribuida utilizando componentes de bajo costo en el ámbito científico, académico y comercial.
El documento se organiza como sigue: el capítulo 1 introduce brevemente al lector sobre los objetivos generales y específicos del proyecto. El capítulo 2 está en parte orientado al lector no especialista, introduciendo las definiciones, conceptos y tecnologías asociadas a este proyecto. También se pone a este trabajo en contexto con los antecedentes del equipo de investigación. El capítulo 3 se concentra en la problemática específica del despacho de cargas. Se discute en detalle el proceso lógico que llevó a seleccionar el parámetro de carga más significativo, y los experimentos asociados.
El capítulo 4 describe el trabajo realizado con la serie histórica de cargas, incluyendo recolección y análisis preliminar. Se describen los métodos a implementar en la modelación de las series. El capítulo 5 reseña el ambiente de simulación experimental implementado, sus características así como los resultados específicos a esta simulación. El capítulo 6 analiza los métodos de predicción de la series temporales comparados, las simulaciones realizadas y los resultados obtenidos. En el capítulo 7 se presentan los resultados experimentales obtenidos con los diferentes criterios de despacho. El capítulo 8 resume las conclusiones y propuestas de trabajo futuro, y a continuación se adjunta la bibliografía y anexos.
Resumen ejecutivo
El proyecto, de nombre "Despacho mejorado de cálculo científico distribuido en redes de computadoras no dedicadas utilizando PVM" fue propuesto y desarrollado por Carlos López (responsable científico del proyecto), Antonio López y Sergio Nesmachnow, en el período Marzo 1998 - Octubre 1999, en el Centro de Cálculo, Facultad de Ingeniería.
Los resultados relevantes obtenidos en el marco de este proyecto comprenden:
Como subproductos del proyecto, se realizaron actividades no mencionadas antes que resultaron en:El diseño e implementación de nuevos algoritmos de despacho de tareas, integrados al ambiente PVM. Estos algoritmos intentan lograr una mejora en el desempeño de una aplicación distribuida mediante la utilización de información estadística de datos históricos de carga. El diseño e implementación de algoritmos de predicción de valores futuros de carga, a partir de un conjunto de datos históricos. Alguno de ellos quedaron integrados totalmente al código PVM, y otros sólo parcialmente. La realización de experimentos preliminares, que mostraron que las tecnologías aplicadas lograron disminuir en un 6,25% el tiempo de cálculo necesario utilizando los criterios estándar de PVM, para el caso de un cálculo científico típico. Este número debe compararse con la mejora alcanzable conociendo perfectamente la carga futura, que es del 14%. Se comprobó que las diferentes Estaciones de Trabajo (ET) podían agruparse y clasificarse de acuerdo a su patrón de uso, encontrando similitudes muy notorias. Eso permitió utilizar las Redes Neuronales de una máquina sobre otra previamente declarada como "similar" sin perjuicios significativos, y con una obvia economía de cálculo. El diseño e implementación de un programa capaz de replicar la carga de una red de computadoras a partir de una serie temporal de datos de carga. El estudio de técnicas no tradicionales de modelización y predicción, basadas en Redes Neuronales.
Reconocimientos
Nelson Calero colaboró en el diseño e implementación
del programa replicador de carga y Felipe Mendivil colaboró en el
diseño e implementación de los algoritmos de despacho. Elías
Kaplan es el autor de los programas utilizados en la etapa de ensayo de
los programas diseñados.
Actividades de difusión
Las actividades de difusión del trabajo comprendieron:
Capítulo1: Introducción
1.1
Procesamiento paralelo y distribuido
Por ello, y debido a la creciente magnitud de los problemas encarados (modelación tridimensional, mallas con miles de puntos, mayor orden de las soluciones, modelación de los fenómenos turbulentos, interfases gráficas en tiempo real, simulación de eventos) la capacidad computacional requerida se ha incrementado. Para satisfacerla, además de mejorar los procesadores, se desarrolló una tecnología basada en el uso simultáneo de más de un procesador, esquema conceptual adaptable en buena parte a la mayoría de las aplicaciones.
Así, la paralelización de programas ha venido realizándose en ambientes científicos y técnicos empleando supercomputadoras con varios procesadores [DAVI90] o redes de computadoras del tipo estaciones de trabajo (ET en lo que sigue) conectadas en red y utilizando comunicación mediante pasaje de mensajes entre los programas ([BERG93]; [DONG93]; [KAPL96]).
Para maximizar el rendimiento de una red formada por ET interconectadas, se hace necesario estudiar las características de uso de cada una de las componentes de la red, de forma de poder explotar los tiempos muertos de unas, para dejar más libres a las otras [MUTK92]. Así se lograría un buen balance de cargas sobre la red, lo cual constituye el objetivo final del proyecto.
El despacho de tareas o procesos sobre un conjunto no acotado de computadoras interconectadas en red teniendo en cuenta la variable "tiempos de comunicación" es un problema NP completo [YANG91]. Aunque en la práctica el número de computadoras en la red está acotado, éste puede llegar a ser muy grande, por lo que el resultado anterior da una idea de la complejidad del problema planteado.
Por otra parte, un ambiente de este tipo visto como una unidad computacional, tiene una capacidad de cálculo del orden de otros equipos mucho más sofisticados (tipo mainframes o máquinas masivamente paralelas), las cuales tienen la desventaja adicional de ser absolutamente propietarias, poco amigables, y no sirven como puestos de trabajo individual. Existen estudios de balance de cargas en multiprocesadores con memoria compartida [SUBR94], arquitectura similar al multiprocesador del CeCal, obteniéndose buenos resultados.
Según la ley de Grosch, que se ha venido comprobando empíricamente durante muchas generaciones de computadoras, el desempeño de una computadora crece con el cuadrado de su valor [MENA93]. Si la computadora forma parte de una red, ese crecimiento puede llegar a ser más que potencial, y por tanto prohibitivo.
Por dicha razón, las estaciones de trabajo de uso personal conectadas en red y con la posibilidad de compartir recursos conforman un ambiente de trabajo cada vez más difundido, no sólo dentro de las Universidades sino también en Instituciones estatales y privadas. Sin embargo, se requiere de una administración eficiente, de forma de habilitar los mecanismos que permitan compartir recursos, minimizando toda perturbación en el desempeño de cada componente de la red.
Lamentablemente, no es fácil encontrar esa administración eficiente.
Empíricamente, se ha comprobado que la aplicación de algoritmos sencillos de balance de cargas mejora el desempeño de los programas distribuidos y, en general, de la red en la que son ejecutados ([SHIV92], [WANG85]).
Mediante un buen conocimiento de los factores de uso de cada una de las ET individuales, se podrán desarrollar algoritmos de predicción de carga de las computadoras que conforman la red, de modo de optimizar el desempeño de la red por medio de una mejora en el gerenciamiento de tareas.
Algunos trabajos ya realizados con ese objetivo, han identificado los parámetros más representativos para medir la carga de una computadora [KUNZ91] a los que se les ha aplicado Teoría de Colas y simulación ([AHMA91]; [EAGE86]) obteniéndose modelos sobre los cuales comenzar un proceso de calibración de parámetros, de forma de ajustarlos lo mejor posible a diferentes redes.
Se han utilizado también técnicas de economía, asignando en tiempo real un costo a cada máquina componente de la red, costo que es función de la disponibilidad de recursos libres que tiene; los criterios de balance de cargas intentarán minimizar el gasto, asignando más tareas a las máquinas más baratas [WALD92]. Sin embargo, no se tiene conocimiento de implementaciones concretas de dichos modelos para ninguna red de computadoras.
Dependiendo de las operaciones a realizar luego de detectado un desbalance de cargas (migración de procesos, re-priorización, recolección de información para próximas tareas son alternativas usuales), es que se plantean diversos objetivos en función de el desempeño que se pretende lograr de la red. [KRUE87]
Normalmente, los usuarios que comprenden que este tipo de redes tiene una gran capacidad de cálculo ocioso y quieren aprovecharlo, subestiman el trabajo subyacente que hay que realizar para que su programa (que actualmente corre en un PC o en un mainframe, requiriendo días de cálculo) pueda ser ejecutado en esta nueva arquitectura, logrando bajar así los tiempos de procesamiento en forma muy sustancial (por lo menos, eso es lo que le prometieron...). Los tres principales motivos por los cuales los usuarios que necesitan grandes capacidades de cálculo no usan este tipo de arquitectura, son (basado en [COOK94]):
1) que no hay beneficios reales en aplicaciones reales:
las mejoras de desempeño que teóricamente se podrían
lograr
mediante la paralelización
de código, se ven enfrentados a problemas tales como deficiencias
en la configuración de las
redes (lo cual las hace inevitablemente ineficientes),
hardware poco confiable, etc.
2) falsas promesas respecto a la facilidad de programación.
Hay una gran falta de herramientas de uso común para el desarrollo
de aplicaciones paralelas (debuggers, profilers,
ambientes de desarrollo, etc.)
3) los sistemas no funcionan bien; las pocas herramientas
que existen, o son de dominio público (lo cual les da la ventaja
de
disponerse de los fuentes, en caso de problemas,
pero con la desventaja de tener soporte nulo o mínimo) o son productos
comerciales extremadamente caros.
Afortunadamente, en la Facultad de Ingeniería la realidad no es tan pesimista: disponemos de una red de más de 100 poderosas estaciones de trabajo conectadas en red, redes de fibra óptica operando a 100 Mbit por segundo, un multiprocesador, todo funcionando en forma armónica, estable y performante, debido a la correcta administración de la misma. Por otro lado, el Centro de Cálculo dicta todos los años (a través de docentes involucrados en este mismo proyecto) un curso de extensión orientado a docentes y no docentes internos y externos a la facultad (Cálculo Intensivo en Sistemas Distribuidos en una Red de Computadoras), de forma de introducir a una asistencia multidisciplinaria y no necesariamente informática, cuáles son las facilidades que este tipo de arquitecturas les pueden proveer.
Hoy en día, en la Facultad de Ingeniería se ejecutan programas paralelos (corriendo en forma distribuida en la red) desarrollados en esa misma casa de estudios por investigadores de variados institutos (Centro de Cálculo, Inst. de Mecánica de los Fluidos, Inst. de Matemáticas, Inst. de Computación). Estos mismos han sido utilizados como banco de pruebas para evaluar los nuevos despachadores de tareas que se implementaron durante el proyecto. A modo de ejemplo se utilizó un modelo numérico de corrientes de marea y viento del Río de la Plata, tema de estudio por investigadores de este grupo ([GUAR92]; [KAPL92]; [KAPL96]). El modelo incorpora la paralelización vía descomposición del dominio de cálculo en bloques [GROP90]. Esto posibilita mejorar la solución del problema al trabajar con mallas de mayor densidad en el modelo global y emplear modelos encajados, con bloques del dominio con tamaño de grilla menor que en el modelo global (del orden de 100 m) para zonas de interés. Una de las aplicaciones más destacadas es la modelación de corrientes en zonas costeras, para estudios del impacto ambiental del vertido de contaminantes o de eventuales derrames de hidrocarburos. Una característica propia del problema es la necesidad de modelar globalmente todo el Río de la Plata para obtener las condiciones de borde a aplicar en el modelo encajado que incluye a la zona de interés.
Dicho programa ya viene siendo probado: modelando en una grilla de 640.000 celdas el tiempo de cálculo del programa serial (utilizando una única estación de trabajo) para 24 horas de simulación resulta ser de 7h30 en tanto el tiempo empleado por el programa usando 4 ET es de 2h20 resultando en una aceleración del cálculo de 3,2 veces. En tanto que modelando simultáneamente las corrientes y el Transporte y Dispersión de un contaminante la aceleración del cálculo llega a 3,5 (tiempo 1 ET 15h, tiempo 4 ET 4h15). Es de tener en cuenta que estos tiempos fueron obtenidos empleando las ET en modo dedicado exclusivamente al modelo. Se ha visto que los tiempos de cálculo, empleando las ET en modo no dedicado, pueden llegar a incrementarse hasta el orden del tiempo serial, dependiendo de las tareas que se ejecuten en ese momento. La meta del presente proyecto es la de minimizar este incremento optando por las ET adecuadas en cada momento.
Todos estos requisitos plantean formidables demandas en capacidad de
cálculo a la computadora utilizada. La única solución
práctica ha sido la utilización de PVM [GEIS93] puesta en
práctica ya en el CeCal [KAPL96]. Existe por lo tanto buen conocimiento
de las prestaciones de la red presente en una aplicación concreta
de interés para el país.
La solución más simple sería el uso de un supercomputador. En nuestro caso esta alternativa se descarta directamente por su costo prohibitivo. Una segunda alternativa sería utilizar las técnicas de cálculo distribuido entre varias computadoras tipo estaciones de trabajo (ET) exclusivamente dedicadas a tal fin. En este caso se puede utilizar software apropiado para lograr valores de desempeño comparables a la del supercomputador. Sin embargo, esta alternativa también es inviable en nuestro medio, por lo que la única posibilidad con un costo razonable es utilizar una red de ET no exclusivamente dedicadas, compartiendo así su uso con otras aplicaciones. Esta alternativa mejora sustancialmente la relación costo/beneficio del equipamiento, al no requerir una dedicación exclusiva del mismo al cálculo.
La situación puede ser distinta en los países desarrollados, donde tanto la primera como la segunda alternativa son moneda corriente. Es por ello que el software desarrollado para manejar redes de ET presta poca atención al problema de la carga futura de la máquina. Simplemente despachan las tareas a medida que se les solicita asignándoselas a las CPUs que no están siendo ocupadas (en el caso de las redes dedicadas) o a la menos cargada instantáneamente (en el caso de redes de uso compartido).
El problema que se plantea en este proyecto es lograr un buen balance de cargas de una red de ET, a través del mejor gerenciamiento del despacho de tareas.
Esta mejora se lograría estudiando los patrones de carga de las computadoras componentes de la red considerada, tratando de predecir su comportamiento futuro y, sobre la base de ello, tomar una decisión óptima en el despacho de tareas (con un horizonte del orden de minutos). Cada vez que una aplicación distribuida tiene que lanzar la ejecución de un proceso a la red, no debe solamente tener en cuenta la carga instantánea de las computadoras interconectadas, sino que también debe ser considerada la información de carga esperada de los componentes de la red.
Para y previo a ello, fue necesario obtener información histórica de la red, a la que se le intentaría ajustar modelos, hasta llegar a un modelo predictor satisfactorio. Esto ya fue realizado con series temporales de tipo meteorológico en otros proyectos del CeCal [LOPE97b], con resultados igualmente exitosos. La modelación de los datos históricos de carga consiste en uno de los principales objetivos del proyecto.
Los nuevos mecanismos de despacho de tareas debían ser integrados al sistema PVM (Parallel Virtual Machine) ([GEIS93]; [DONG93]), que es uno de los más usados para programar aplicaciones distribuidas en una red de computadoras. Se requería que la integración de estos nuevos algoritmos de despacho fuese totalmente transparente para los usuarios que ya tengan aplicaciones PVM en funcionamiento. Los usuarios deberían ser capaces de aprovechar las ventajas de los nuevos algoritmos de despacho sin cambios en el código de los programas, simplemente compilando sus aplicaciones contra el sistema PVM modificado que se desarrollaría en este proyecto.
Finalmente, para probar la bondad de los nuevos algoritmos considerados, es necesario confrontarlos con las estrategias nativas de PVM, bajo las mismas condiciones de carga. Esto implicó el diseño de un experimento que permite correr programas distribuidos bajo condiciones de carga prefijadas (o sea, no libradas al azar), pero usando distintos criterios de predicción de carga a futuro.
Lograr este ambiente no es un problema menor y consistió en otro de los objetivos del proyecto. Para ello, se dispuso de una serie histórica de la carga de las computadoras de la red en estudio, y datos fehacientes de su potencia relativa. Se requirió implementar programas que permiten reproducir la situación de carga de esas computadoras en forma lo más "coherente" posible con la información histórica disponible puesto que era necesario poder repetir el experimento de lanzar un mismo programa distribuido, a un mismo estado de carga de la red, con distintos criterios de predicción, de forma de establecer una justa comparación.
El programa diseñado, denominado "Replicador de Cargas" permite replicar datos históricos de carga sobre un conjunto de máquinas con valores bajos de carga base. Solamente contando con un ambiente con exactamente las mismas condiciones de carga será posible realizar una comparación válida entre las nuevas estrategias de despacho y la ya existente en PVM.
El desempeño del sistema en su conjunto fue evaluado utilizando programas de cálculo científico actualmente operativos en el CeCal, relacionados con aplicaciones reales de interés para el Uruguay. En particular se empleó el mencionado programa PTIDAL para el cálculo de corrientes de marea desarrollado en el CeCal [KAPL96]. Continuando con el ejemplo ofrecido, para analizar el comportamiento de una mancha de petróleo (como la del recordado accidente del buque San Jorge ocurrido en 1998) es necesario simular una semana de corrientes y del transporte del contaminante. Dicho cálculo realizado en forma serial (operando en una única ET potente y dedicada) emplearía 4,5 días, lo cual resulta inaceptable. Para decidir las medidas a tomar que contrarresten los efectos catastróficos del accidente los plazos son mucho más exigentes.
En cambio el programa distribuido empleando 4 ET (también dedicadas
exclusivamente) simula dicho comportamiento en sólo 1,2 días,
lo
cual sería aceptable si fuera posible disponer dicho equipamiento
en forma exclusiva. El problema surge al realizar la simulación
en forma distribuida con las ET no dedicadas exclusivamente a este
cálculo lo que ocasiona un incremento del tiempo de cálculo
que puede a llegar a superar el tiempo serial en función
de cómo se seleccionan las ET a emplear. La meta final del presente
proyecto consistió en optimizar el uso de las ET de forma de poder
realizar el cálculo antedicho minimizando el tiempo de cálculo.
Dichos problemas planteaban:
Una vez cumplido con los puntos anteriores, se realizó un ensayo
comparativo de los diferentes métodos de despacho propuestos, y
se evaluaron los resultados en términos del tiempo requerido de
cálculo, utilizando como problemas de testeo modelos numéricos
existentes escrito en FORTRAN y C.
El presente capítulo introduce los ambientes de
computación paralela, describiendo desde las variedades de hardware
especialmente diseñado a tales fines hasta redes de computadoras
de uso general, y las técnicas de programación existentes
para sacar provecho de las mismas. Finalmente expone la experiencia existente
en el Centro de Cálculo respecto de estos temas, poniendo así
en contexto esta investigación.
La gran diferencia entre las arquitecturas paralelas está dada por el hecho de si los procesadores comparten o no una misma memoria. Existen dos grandes familias de arquitecturas paralelas: con memoria compartida y con memoria distribuida.
A continuación se describen dichas arquitecturas,
reseñando las principales características de cada una, pero
enfatizando en un caso particular de arquitectura de memoria distribuida,
que constituye la utilizada en este proyecto.
Esta arquitectura tiene como virtud más destacable
el hecho que la comunicación entre los procesadores es muy rápida
dado que se comunican a través del bus. Sin embargo, éste
puede convertirse en un cuello de botella. Además, la complejidad
electrónica de estos multiprocesadores crece en forma exponencial
con el número de procesadores. Ello es debido a que, por consideraciones
de desempeño, cada procesador dispone de una memoria caché
independiente. El problema de mantener ese caché consistente con
los cachés de los demás procesadores y con la memoria compartida
hace que la electrónica de las placas madre sea muy compleja y poco
escalable (este problema es conocido en la literatura como "problema
de coherencia del caché"). Este hecho limita en la práctica
la cantidad máxima de procesadores a algunas decenas.
Figura 2.1: en una arquitectura de memoria compartida,
todos los procesadores comparten la misma memoria
Esta arquitectura es escalable para aplicaciones apropiadas para esta topología (decenas de miles de procesadores). Existen máquinas comerciales con esta arquitectura que llegan a los miles de procesadores; como ejemplo puede citarse la "Connection Machine 5", con 16.000 procesadores.
La figura 2.2 resume gráficamente las características
de una arquitectura paralela basada en el concepto de memoria distribuida.
Este caso particular de multiprocesador, si bien adolece de problemas serios (comparado con las dos arquitecturas antes mencionadas) tiene las siguientes dos grandes ventajas:
Figura 2.3: en una red de computadoras, cada procesador
dispone de su
propia memoria privada y se comunica con los demás
procesadores
a través de la red compartida.
PVM (Parallel Virtual Machine) es un proyecto nacido en 1989 en el Oak Ridge National Laboratory para uso interno. En 1991 trasciende dicho laboratorio y se difunde su utilización, básicamente en ambientes académicos y dedicado a resolver aplicaciones científicas que demandaban gran consumo de procesador. Con la información obtenida de dichas experiencias, en 1993 PVM es re-escrito completamente y se transforma en un software de dominio público de uso masivo [PVM93].
PVM provee al desarrollador una capa de servicios de alto nivel que simplifican el armado de aplicaciones distribuidas. Las funcionalidades más importantes son:
En la técnica de Descomposición Funcional, la aplicación distribuida ejecuta en diferentes procesadores diferentes porciones de código en forma simultánea. O sea, en cada instante de tiempo se ejecutan en varios procesadores diferentes programas. Por ejemplo, un cajero automático, mientras solicita el número de cuenta corriente, puede estar comunicándose con la computadora del banco para validar un dato anteriormente ingresado; o sea, estaría ejecutando dos programas distintos al mismo tiempo (ingreso de datos y validación de datos).
En la técnica de Descomposición de Dominio,
la aplicación distribuida ejecuta en los diferentes procesadores
la misma porción de código, pero trabajando sobre diferentes
conjuntos de datos. Citando un ejemplo, para realizar el procesamiento
de una imagen, ésta puede ser dividida en tres partes iguales y
procesada en forma independiente por tres procesadores distintos que ejecuten
el mismo programa (situación típica en el proceso de filtrado
de imágenes).
Figura 2.5: Ejemplo de aplicación distribuida
utilizando la técnica
de descomposición de dominio
En el Centro de Cálculo se trabaja con esta herramienta desde sus orígenes, y se tiene una muy buena experiencia, tanto en desarrollo de aplicaciones distribuidas, como en el desarrollo de herramientas. Yendo aún más lejos, y aprovechando el carácter de dominio público de PVM, en el Centro de Cálculo se ha modificado el mismo código fuente de PVM para mejorar algunas características que originalmente tenían una implementación efectiva pero muy simple. En lo que sigue se presenta la experiencia existente en el Centro de Cálculo al respecto.
Con el tiempo, la cantidad de computadoras conectadas a la red fue creciendo, pero no así el ancho de banda; aún hoy, la red sigue siendo Ethernet a 10 megabit por segundo. Las comunicaciones se transformaron en un cuello de botella que había que resolver.
En 1994 el Centro de Cálculo propuso ante la Comunidad
Europea un proyecto de creación de una máquinas virtual paralela
de alta capacidad. Este proyecto compitió con más de 100
de proyectos presentados por organizaciones y universidades de todo el
mundo. Finalmente, fue aceptado y se recibió una importante financiación
que permitió crear una máquina virtual de 7 procesadores
y adquirir hardware de comunicaciones de alta velocidad, de última
generación en su momento. Dichas máquina, que se encuentra
aún en funcionamiento, ejecuta sistema operativo AIX y está
conformada por tres estaciones de trabajo y un multiprocesador BULL de
4 procesadores; todas las máquinas están conectadas en forma
privada en red a través de un doble anillo de fibra óptica
utilizando protocolo FDDI funcionando a 100 megabit por segundo. Con este
equipamiento, el Centro de Cálculo se independizó del recurso
compartido que representaba la red de Facultad y las computadoras de los
otros institutos.
Figura 2.6: La red fddi.fing.edu.uy es un multiprocesador
construido en el Centro de Cálculo
en el marco del proyecto ITDC-94, financiado por la
Comunidad Europea; está conformado
por tres RS6000 monoprocesador y un RS6000 multiprocesador
(4 procesadores, con
memoria compartida) todos con sistema operativo AIX
y conectados en red a través de un
doble anillo de fibra óptica con protocolo
FDDI a 100 MBIT por segundo.
Si bien la máquina paralela construida en 1994 dio muy buenos resultados, sus componentes individuales son piezas de hardware de elevado costo. En los últimos años los procesadores Intel han reducido sensiblemente su costo a la vez que mejoran sus prestaciones, y hoy en día es posible crear máquinas paralelas de similar potencialidad a la anterior, pero utilizando componentes mucho más económicos (inexistentes en 1994).
En 1998 el Centro de Cálculo, tomando ideas del proyecto Beowulf y de Extreme Software, decide empezar a construir máquinas paralelas basadas en hardware Intel y sistemas operativos Linux y Windows NT. Dichos proyectos hoy en día tienen financiación de proyectos CONICYT (fondo Clemente Estable) y del apoyo de docentes, investigadores varios y grupos de estudiantes de grado y de posgrado quienes desarrollan sus estudios sobre esta tecnología emergente.
Una de ellas era un Modelo Climático Global desarrollado en la Universidad de California (UCLA) y que en ese momento había sido modificado en el IMFIA (Instituto de Mecánica de los Fluidos e Ingeniería Ambiental) y era utilizado para modelar el impacto en nuestro país de la Corriente del Niño.
Por otro lado, el Modelo de Mareas del Río de la
Plata desarrollado en el Centro de Cálculo fue el principal uso
que se le dio a esta máquina virtual, tal como estaba previsto en
el proyecto que le dio origen. A través de la técnica de
descomposición de dominio se distribuyeron en las cuatro computadoras
los datos correspondientes a la batimetría del Río de la
Plata y se aplicó el modelo numérico en forma paralela sobre
dichos conjuntos de datos. Las figuras 2.7 y 2.8 muestran gráficamente
la descomposición utilizada e ilustran las mejoras de desempeño
obtenidas.
Figura 2.7: Descomposición de dominio utilizada
para paralelizar
el modelo numérico del Río de la Plata
Además, el Centro de Cálculo ofreció desde 1994 en adelante asesoramiento permanente a otros grupos de investigación dentro de facultad, fomentando el uso de su máquina virtual paralela, asesorando técnicamente a los desarrolladores e incentivando el uso de PVM.
Como forma de difusión y fomento de la tecnología, todos los años se dicta un curso de actualización y de posgrado sobre Computación de Alto Desempeño [HPC99] y propone y dirige varios proyectos de grado por año para los estudiantes de la carrera de Ingeniería en Computación [PCOM98], [MATP96], etc.
Figura 2.8: Mejoras de tiempo obtenidos para diferentes
densidades de la grilla de datos,
utilizando cuatro procesadores en lugar de un único
procesador.
Aquí entran en juego dos temas: por un lado, será necesario que el algoritmo de despacho pueda administrar (recolectar, almacenar y explotar) información histórica de la carga de cada computadora de la red, y además se deberán implementar y comparar varios algoritmos de predicción. Este proyecto creará la infraestructura necesaria, absolutamente integrada a PVM, que permita crear y probar nuevos algoritmos de despacho de tareas.
La experiencia en el Centro de Cálculo, además de ser muy extensa, ha sido muy rica en este sentido. Los resultados obtenidos en los variados proyectos ejecutados han sido más que satisfactorios, lo que motivó e impulsó a seguir investigando en el estudio para mejorar las herramientas de software existentes con el fin de dar soporte a la programación de multiprocesadores utilizando el pasaje de mensajes.
La elección de las máquinas más apropiadas
para despachar tareas es uno de los parámetros determinados en tiempo
de ejecución que más influencia tienen en el desempeño
final de una aplicación distribuida. El objetivo de este proyecto
es mejorar el muy sencillo algoritmo de despacho de tareas de PVM, y cuantificar
la mejora obtenida en algún caso representativo.
Cuando muchas tareas cooperan para la resolución de un problema
complejo, una demora individual de una tarea ocasiona que la aplicación
completa se demore, llegando a una situación donde el resto de las
tareas deben esperar por aquella retrasada en un punto de sincronización.
Las técnicas de balance de cargas permiten a las aplicaciones distribuidas
evitar estas situaciones en la medida de lo posible, distribuyendo de forma
equitativa la carga de trabajo sobre las ET que componen la red.
Figura 3.1: Sistema distribuido sin balance de cargas
(extraída de [SHIV92])
Las técnicas de balance de carga se clasifican en estáticas y dinámicas. Las técnicas estáticas determinan los procesadores a los cuales se asignará cada tarea en las primeras etapas de la aplicación o aún antes del inicio de su ejecución, y esta asignación se mantiene independientemente de los posibles problemas que surjan en la ejecución de tareas individuales. Esta estrategia es efectiva en redes poco cargadas y falla en ambientes compartidos de carga variable, donde habitualmente existen aplicaciones que compiten por los recursos.
En contrapartida, las técnicas dinámicas de balance de cargas involucran una estrategia para determinar el procesador, al cual se asignará una tarea durante la ejecución de la aplicación. Usualmente el modelo utilizado es el de amo-esclavo, siendo un programa "amo" quien crea un conjunto de tareas "esclavas", las cuales no requieren comunicación entre sí. La decisión sobre el procesador a asignar comúnmente se realiza teniendo en cuenta la situación en el instante del despacho exclusivamente.
La propuesta aquí presentada involucra la utilización
de información estadística de carga de la red para la determinación
de la ET más adecuado para una tarea en el momento del despacho,
de manera de mejorar el balance de cargas. Para determinar dicha ET se
utilizarán herramientas estadísticas para la predicción
de los parámetros relevantes de carga. Por lo expuesto, este enfoque
se clasifica dentro de las técnicas dinámicas de balance
de cargas.
Para lograr una mejora significativa en el desempeño de una tarea distribuida, utilizando como medida el tiempo de demora de ejecución, es necesario determinar cuales parámetros son relevantes para indicar si una máquina se encuentra cargada.
Del conjunto de parámetros obtenidos mediante llamadas al sistema UNIX, existen algunos de relevancia mínima, debido a que sus variaciones son resultado de procesos de duración infinitesimal. La carga producida por cambios de contexto, swapping y paging son ejemplos de este tipo de parámetros. El tiempo de ejecución promedio de una aplicación distribuida es del orden de minutos, e inclusive horas; y no es razonable prestar atención a variaciones casi instantáneas de estos parámetros de carga.
Otros parámetros despreciables son aquellos cuya variación observada es prácticamente nula. Tal es el caso de los errores en la recepción de datos. Inclusive existen parámetros de carga cuya variación usualmente refleja limitaciones de hardware las cuales pueden no estar presente en otros equipos.
En virtud de lo expresado se optó por considerar como parámetros relevantes para la determinación de la carga de una ET el consumo de CPU, de disco y de red.
De acuerdo a ideas empíricas propias y consideraciones sobre trabajos en el área (Kunz [KUNZ91] expresa que el índice más efectivo para la mejora de desempeño es la cola de procesos en CPU), se decidió investigar la relación existente entre el consumo de CPU y el desempeño de una tarea distribuida medida por su tiempo de ejecución.
3.3 Análisis
del consumo de CPU como factor preponderante en la demora de ejecución.
La tarea individual utilizada estuvo compuesta por un conjunto de instrucciones estándar del cálculo científico (operaciones aritméticas de punto flotante, iteraciones y recursiones, compilación de programas extensos, etc.), destinadas a realizar un considerable consumo de CPU. El comportamiento casi determinístico de esta tarea fue determinado a partir de su ejecución repetida sobre una máquina dedicada (sin otra carga base presente).
Los resultados obtenidos se comentan a continuación:
Al obtener pequeñas diferencias en los tiempos de ejecución, fue posible concluir que el programa test tenía un comportamiento casi determinístico. A continuación se ofrecen ejemplos de los resultados obtenidos con datos recolectados de las máquinas maserati.fing.edu.uy y volvo.fing.edu.uy. Los histogramas de las figuras 3.2 y 3.3 ofrecen la distribución de los tiempos de demora de ejecución para la tarea en cuestión, sobre un total de 300 experimentos.
Figura 3.2: Comportamiento casi determinístico del programa
test.
Datos obtenidos luego de 300 ejecuciones en volvo.fing.edu.uy
Cabe considerar que si bien los resultados deberían haber sido obtenidos bajo condiciones nulas de carga, éste es un caso ideal en nuestro entorno (donde no es posible eliminar todos los procesos del sistema), por lo cual es factible que la precisión pueda ser mejorada utilizando máquinas dedicadas para tal fin.
Resultados como el anterior fueron corroborados en máquinas
de diferentes arquitecturas que forman nuestra red, como petunia.fing.edu.uy
(Dell), maserati.fing.edu.uy (Sun Sparc) y nautilus.fing.edu.uy (Bull DPX/20
490 Workstation).
El experimento de la sección precedente permitió determinar la relación directa entre el consumo de CPU y el tiempo requerido para la ejecución de una aplicación típica de cálculo científico. Con respecto a los restantes parámetros a priori relevantes, es conveniente realizar algunas puntualizaciones.
La utilización de disco se mide mediante la cantidad de bloques de datos que se transfieren desde el núcleo del sistema operativo al dispositivo. Para el tipo de aplicaciones objetivo con las cuales se propone trabajar en el presente proyecto (aplicaciones de cálculo científico) el consumo de disco no aporta una carga significativa para la computadora, salvo en instancias de inicialización o almacenamiento de los resultados. Generalmente las aplicaciones de éste tipo tienden a utilizar principalmente la CPU, y es razonable determinar que la utilización de disco no tiene la misma importancia para la mejora de desempeño que el uso de CPU.
Además, el consumo de disco usualmente viene acompañado de un aumento significativo en la utilización de CPU, la cual se encarga del manejo de los datos a transferir, tanto en el caso de lectura como de almacenamiento. Es de esperar que la utilización de disco se vea reflejada en un aumento en el consumo de CPU, parámetro que se modeló para intentar predecir los valores de carga futura.
De todos modos se recolectaron valores de utilización de disco de las máquinas de la red, utilizando llamadas al sistema operativo UNIX, con la idea de procesarlos mediante el análisis estadísticos de series temporales.
Para el caso de utilización de disco, el estudio determinó una relación directa respecto a la demora de ejecución, pero no fue posible verificar proporcionalidad alguna, o expresar la demora como una función sencilla de la utilización de disco. Obviamente repercuten los factores anteriormente mencionados, y por lo tanto se decidió trabajar primariamente con el consumo de CPU como parámetro de determinación de la carga.
Con respecto al tráfico de red, el cual mide la cantidad de paquetes transferidos entre una ET y el resto, se pudo comprobar que constituye un parámetro importante para la determinación de la carga. Pero para el caso de una aplicación de cálculo científico distribuido, la relevancia fundamental consiste en el tráfico de paquetes producto de la comunicación entre las tareas que ejecutan en paralelo. Usualmente dicha comunicación se realiza al comienzo de la tarea (inicialización), al final de la misma (devolución de resultados) y eventualmente en algún punto de sincronización intermedio. Intuitivamente, el tráfico de red que ocurre en el intervalo comprendido entre estos instantes no tiene una repercusión directa sobre el tiempo de ejecución total de la tarea, que constituye la medida de desempeño adoptada. Además, se puede argumentar que ese tráfico es sensiblemente independiente de la ET a la que se despachó la tarea.
La recolección de los datos de tráfico de red permitió determinar a priori la dificultad de trabajar con este parámetro. La disposición física de los equipos, la forma de comunicación entre los mismos, e imponderables que no es posible modelar, ocasionan a menudo la saturación de segmentos de la red, obligando a modificar el ruteo de paquetes.
Como resultado del análisis de los parámetros representativos, se decidió trabajar solamente con el consumo de CPU, el cual se mostró como el más representativo de la carga de una máquina, y con incidencia directa sobre la demora de ejecución. Los datos de uso de disco y de red fueron de todos modos recolectados para aplicarles la teoría de modelización de series temporales, pero sabiendo desde un principio que la dificultad de trabajar con estos parámetros no sería menor.
También fueron realizados experimentos análogos al realizado para el consumo de CPU para el caso de uso de disco y red. Fue virtualmente imposible determinar una correlación entre los valores de tráfico de red y la demora de ejecución de la tarea casi determinística. Los valores de tráfico de red mostraron grandes picos, y variaciones importantes en períodos cortos de tiempo. Dependiendo de las características de la aplicación, la optimización de tráfico de red entre los procesos de la aplicación distribuida puede lograrse mediante una correcta estrategia de división del problema, evitando la granularidad excesiva. [CHIE97]
La utilización de los datos de consumo de disco
y tráfico de red, así como de algún otro parámetro
de los disponibles por el sistema operativo, ha quedado planteado como
un trabajo futuro. Además, la propuesta inicial preveía trabajar
con bloques de variables para determinar posibles correlaciones. Este trabajo
fue realizado para el caso de consumo de CPU - uso de disco tal como se
describe en el siguiente capítulo, pero ha quedado pendiente el
estudio de otros bloques de parámetros de carga.
En los sistemas UNIX, el núcleo (kernel) almacena información estadística sobre los procesos en ejecución en el sistema. Dicha información es accesible a las aplicaciones mediante llamadas al sistema, que retornan valores en estructuras propietarias de las diferentes implementaciones del sistema operativo. En UNIX SVR4 se utiliza el filesystem /proc, en BSD4.3 se utilizan las llamadas al sistema pkvm. En ambas implementaciones se halla disponible la llamada al sistema rstat(), que brinda información sobre los parámetros de carga del sistema. Utilizando esta función se diseñó una solución abierta, independiente de la plataforma y de la versión del sistema operativo para la recolección de datos.
Los datos recolectados fueron procesados mediante el análisis de Series Temporales para luego ser utilizados en la modelización y predicción de valores futuros.
Las actividades desarrolladas se describen a continuación.
Los valores recolectados consistieron en datos de carga de la red de computadoras del Centro de Cálculo y de una red de similares características en Estocolmo, Suecia. El consumo de CPU, disco y red fue determinado en intervalos de 5 minutos y un minuto, y almacenado para su posterior análisis. La recolección de datos se realizó sobre máquinas que pueden considerarse, en cuanto a su uso, como representativas de la red de Facultad, de arquitecturas heterogéneas y con diferentes versiones del sistema operativo UNIX.
Para la recolección se utilizó la mencionada función rstat(), la cual ofrece un conjunto de parámetros de carga donde se incluyen aquellos que seleccionamos como relevantes. La información recolectada fue almacenada en archivos y puede visualizarse en forma gráfica mediante interfases como ProcMeter (Linux 1.2.13) o Perfmeter V3.5.1.
La figura 4.1 ofrece un ejemplo de interfase de visualización
de
datos de carga, la interfase ProcMeter.
Las técnicas utilizadas para el procesamiento se denominan genéricamente como Análisis de Series Temporales. Una Serie Temporal consiste en un conjunto de datos cronológicamente ordenados. En este caso, los datos tomados en cuenta corresponden a los parámetros indicados como relevantes para la determinación de la carga, que son: uso de CPU, uso de disco y tráfico de red.
El cometido del análisis previo a la modelización consistió en:
El enfoque seguido para el análisis permitió
dividir el trabajo en tres partes: a) el análisis individual de
datos para cada componente de la red (análisis univariado),
b) el estudio de las correlaciones entre parámetros y c) entre equipos
de la red (análisis multivariado).
Las variables consideradas para el análisis fueron el uso de CPU, y el uso de disco. En el capítulo anterior se comentó la dificultad existente para determinar una relación entre los datos de tráfico de red y la demora de ejecución. El análisis de datos de tráfico se propone como una actividad a desarrollar en el futuro.
La metodología aplicada en esta parte del análisis de datos se basó en los modelos ARMA y ARIMA para el análisis de series estacionarias y series no estacionarias reducibles a estacionarias mediante transformaciones. Para el caso de series afectadas por variaciones abruptas las cuales contienen datos que escapan de los valores razonables, fueron utilizadas técnicas de detección de outliers.
Las gráficas siguientes ofrecen resultados representativos de los valores de carga recolectados, en horarios diurnos. La figura 4.2 muestra los datos de carga de la máquina dynsys.fing.edu.uy, representativa de un conjunto de máquinas muy utilizadas, con valores de carga considerables. La máquina dynsys.fing.edu.uy funciona como servidor de disco. La serie temporal de datos de carga tiene la forma indicada en la gráfica y se clasifica dentro de las series estacionarias con respecto a la media. Los valores aparentan fluctuar alrededor de un cierto valor medio no nulo.
Figura 4.2: Serie temporal de datos de carga
de la máquina dynsys.fing.edu.uy
La figura 4.3 resume los datos de carga de la máquina guille.fing.edu.uy. La serie temporal muestra valores bajos de carga, e inclusive algunos valores nulos. Pero además, se manifiesta la presencia de valores discordantes, los cuales no siguen el patrón de comportamiento global. Estos valores son conocidos como outliers y corresponden, en nuestro caso, a variaciones instantáneas de la carga, generalmente por efecto de la ejecución esporádica de procesos del sistema. Este tipo de series temporales se denominan no estacionarias.
El análisis individual de las series temporales de carga permitió arribar a algunas conclusiones, las cuales se detallan a continuación:
Figura 4.3: Serie temporal de datos de carga
de la máquina guille.fing.edu.uy. Tiempo medido
en minutos
En caso de verificarse una relación directa, era suficiente trabajar con el consumo de CPU como único parámetro representativo, despreciando la contribución del consumo de disco a la carga de la ET.
Por otra parte, en caso de no identificar una relación sencilla entre los parámetros mencionados, sería necesario continuar con el desarrollo de la modelación por separado, considerando los parámetros uso de disco y uso de CPU como variables independientes.
Los resultados del experimento mostraron una relación directa entre el aumento de uso de disco y el consumo de CPU. Al realizar operaciones de transferencia de datos, los procesos que controlan la transferencia consumen un considerable porcentaje de CPU. Obviamente la relación recíproca no se verifica, puesto que el uso de la CPU no involucra transferencia de datos a memoria secundaria, dado que generalmente se trabaja con los datos en memoria.
Algunos resultados de los análisis se ofrecen en la figura 4.4, con datos de saddle.fing.edu.uy. Puede observarse que el uso intensivo de disco (cuantificado por la cantidad de bloques transferidos) es acompañado de un incremento sustancial en el consumo de CPU. El resultado ha sido corroborado para otras máquinas de la red ejecutando diversas aplicaciones de cálculo.
Figura 4.4:Correlación entre consumo de CPU
y uso de disco para
la máquina maserati.fing.edu.uy. Tiempo medido
en minutos
El resultado obtenido condicionaría el desarrollo de los métodos de modelización y aún más, de los algoritmos de despacho. En caso de determinar una relación entre los valores de carga de diferentes máquinas, sería necesario desarrollar e implementar métodos multivariados de predicción de valores futuros. De no ser así, los métodos de predicción solamente deberían considerar los datos de la ET cuya carga se desea predecir.
El experimento estadístico planteado consistió en determinar si los datos de carga de las ET consideradas en el transcurso de este proyecto (saddle.fing.edu.uy, canada.fing.edu.uy, cecal.fing.edu.uy, dynsys.fing.edu.uy, guille.fing.edu.uy) correspondían a una misma distribución de probabilidad. Se utilizó para ello el test de Kolmogorov-Smirnov, el cual permite determinar si dos muestras corresponden a poblaciones con funciones de densidad de probabilidad diferentes o en su defecto, si los conjuntos son consistentes con una función de distribución que puede ser conocida de antemano o no.
Los resultados determinaron la existencia de correlaciones entre subconjuntos del conjunto de máquinas estudiado. Los valores de carga de saddle.fing.edu.uy y dynsys.fing.edu.uy probaron tener una similitud significativa, cuantificada por el nivel de confianza de 95% ofrecido por el test. La ET cecal.fing.edu.uy mostró una distribución diferente a la ofrecida por las máquinas mencionadas anteriormente, aún cuando las mismas son de su misma arquitectura (Sun Sparc/Sun OS). El motivo fundamental se vincula con el perfil de los usuarios de los equipos y los servicios brindados. Tanto cecal.fing.edu.uy como guille.fing.edu.uy son máquinas con bajo consumo de CPU en horas diarias, y prácticamente nulo en horario nocturno.
Por su parte, otras máquinas de la misma arquitectura (canada.fing.edu.uy, guille.fing.edu.uy) mostraron una correlación similar entre los valores de CPU. El nivel de confianza alcanzado fue del 90%.
En los primeros se estima que el valor futuro de carga puede expresarse como una combinación lineal de los valores históricos de la propia ET. La expresión funcional general para la carga de una ET j es:
Típicamente el vector x contiene los valores de carga en el instante del despacho y tanto w como b son constantes. Los métodos de BoxJenkins [BOXJ70] y similares pertenecen a esta categoría, aún cuando eventualmente utilizan información de instantes anteriores al momento del despacho.
Para la determinación de los parámetros w y b se utilizan variadas técnicas, algunas de las cuales se presentan en la siguiente sección.
En los métodos no lineales la relación funcional entre datos históricos de carga y el valor a predecir se representa por una función no lineal. Si bien es posible aplicar técnicas estadísticas
estándar para la predicción, nuestro enfoque sobre estos métodos fue basado en la aplicación de Redes Neuronales.
Se puede aplicar una segunda clasificación para los métodos de predicción, distinguiendo entre univariados o multivariados. Los métodos univariados utilizan solamente los datos de carga disponibles de la máquina en cuestión para determinar el valor futuro. No tienen en cuenta posibles correlaciones con los datos procedentes del resto de las máquinas de la red. Una estimación univariada grosera (la que realiza PVM) consiste en utilizar el dato de carga observado en el instante anterior, asumiendo que la carga no variará sustancialmente.
Por su parte los métodos mutivariados consideran la totalidad de datos de carga disponible en el momento del despacho, involucrando en su fórmula de predicción del valor futuro de carga de una ET particular los datos de carga del resto de las ET.
Debido a la sensibilidad del método a la presencia de outliers, debe realizarse un preprocesamiento de los datos de carga con el fin de removerlos, o el método carecerá de la precisión necesaria como método de predicción. Este problema podría resolverse utilizando métodos que son inherentemente resistentes (en realidad, indiferentes) a la existencia de una fracción predeterminada de outliers en los registros disponibles. Estos métodos se describen a continuación, pero no han sido implementados en los experimentos debido a los altos requerimientos de cálculo de los coeficientes. A su favor (y como se verá luego, en forma similar a los métodos no lineales) puede decirse que esos cálculos pesados son realizados en forma previa al uso, por lo que pueden hacerse fuera de línea.
El comportamiento descrito no puede ser modelado eficientemente mediante algoritmos estáticos de predicción, y el alto consumo de CPU necesario en la implementación de algunos métodos hace impracticable su implementación adaptativa.
Fueron investigados métodos lineales adaptativos, los cuales pueden modificar el valor de los parámetros utilizando la información reciente. Ellos permiten contemplar cambios de configuración, de disposición física de los equipos, etc., sin necesidad de considerar un gran volumen de información histórica. Otra ventaja de un algoritmo adaptativo consiste en que puede comenzar la predicción en forma prácticamente instantánea, dado que considera pocos valores históricos para la predicción. Como desventaja, debe citarse la dificultad de implementación dentro del PVM de todo el código necesario, motivo por el cual sólo se realizaron análisis preliminares.
La idea del método se explica en el desarrollo siguiente, basado en Ljung [LJUNG95], capítulo 10.
Un algoritmo recursivo típico se implementa basado en la fórmula
El valor determina de que manera el error cometido en el tiempo t, afecta al cálculo del nuevo valor del parámetro estimado. Típicamente se elige , siendo una aproximación del gradiente respecto a de , es decir de la predicción de de acuerdo al modelo descrito por .
Se utilizaron métodos lineales de múltiples entrada y una única salida, basados en la función rpem.m de Ljung [LJUNG95]. Los parámetros del modelo genérico
son polinomios en el operador de demora q, por ejemplo:
La ecuación (3) contempla el caso multivariado, donde y los coeficientes son matrices de dimensión ny por ny. Los métodos ARX, ARMAX y Box-Jenkins pueden ser considerados como casos especiales del método general expresado por la ecuación.
Utilizando todos los datos históricos disponibles es posible hallar los coeficientes (contenidos en la matriz A) para lograr un mejor ajuste de los datos con el modelo. Sin embargo, para permitir que los parámetros del sistema cambien sus valores con el tiempo solamente fue considerada la estimación recursiva de parámetros.
Una descripción detallada de los métodos de análisis basados en Series Temporales puede hallarse en [WEI89].
El problema de elegir el "mejor" método de predicción no es nuevo. Ya trabajos como los de Makridakis ([MAKR82]; [MAKR93]) lo han intentado y desafortunadamente la conclusión es que no hay un método que sea universalmente óptimo para cualquier serie. En particular, el trabajo de Makridakis descrito en [MAKR82], también denominada "Competencia M" comparó 24 métodos con 1001 series de datos diferentes, llegando a la conclusión que la ventaja de los métodos de Box y Jenkins (1970) para series univariadas que resultaba de los experimentos previos no era tal.
Por otra parte, algunos métodos más modernos surgidos con posterioridad fueron contrastados con éxito con la misma base de datos. Así, Sharda and Patil [SHAR90] compararon el desempeño de las Redes Neuronales con los métodos de Box y Jenkins en 75 de los casos de la Competencia M, llegando a la conclusión que las primeras pueden mejorar significativamente el desempeño de las últimas en algunos casos. Similares resultados fueron obtenidos por Chang y Fishwick [CHAN91]. En los experimentos realizados pudieron verificar que incluso en varios de los casos en que Sharda y Patil declaraban que las Redes Neuronales tenían un resultado comparable al método de Box y Jenkins las redes no habían sido suficientemente entrenadas, o los parámetros no habían sido convenientemente elegidos. Ellos mostraron que las Redes Neuronales podían rendir mejores resultados que los informados, pero que ello requería un análisis mas detallado de los datos.
Este resultado no es sorprendente. En los últimos 10 años (a partir del trabajo de Rumhelhart [RUMH86]) se ha avanzado mucho en el tema, y la técnica se ha aplicado con éxito en muchos más casos que los cubiertos por la Competencia M. Sólo a modo de ejemplo pueden citarse: estudio de la demanda en redes eléctricas ([ISLA95]; [SRIN95]; [MIYA95], de contaminantes en la atmósfera [BOZN93], toma de decisiones [MARQ94] y recientemente por parte de nuestro equipo en el tema de series temporales de lluvia diaria [LOPE97b]. En particular éste resultado nos orientó a la aplicación de las Redes Neuronales para realizar la predicción de datos de carga. Para el lector interesado, en [NYCH96], [STER96], [WARN96]. se describen el concepto y el uso de Redes Neuronales como herramientas estadísticas, aunque más abajo se da una pequeña introducción.
Chang y Fishwick ([CHAN91]) también observaron que las Redes Neuronales tenían un mejor desempeño cuando se las utilizaba para extrapolar directamente 12 meses a partir de los 12 anteriores, en lugar de aplicar 12 veces una extrapolación de un mes (como requiere Box y Jenkins o como podría hacerse también con Redes Neuronales). Ello tiene implicancias inmediatas para un problema como el nuestro, ya que fijado el horizonte de la predicción, lo que interesa es minimizar el error conjunto y no necesariamente hacer una predicción óptima para los primeros instantes en desmedro de los posteriores.
Al igual que en el caso de los métodos tradicionales, para la aplicación de las Redes Neuronales se realizaron dos etapas. La primera consistió en evaluar la posibilidad de producir estimaciones razonables basándose únicamente en la historia de la CPU particular en la que se requiere la predicción. Este enfoque univariado se manifestó como imprescindible, porque podría ocurrir que la misma diera resultados razonables, evitándose por tanto la complejidad de las redes multivariadas (que tienen más parámetros a entrenar).
La segunda etapa se orientó a realizar la predicción basándose en la información temporal de la CPU dada, y de las demás de la red. Para el entrenamiento, se esperaba que sólo un número limitado de muestras fuese suficiente, lo que permitiría manejar eficientemente eventuales cambios en la red (aparición de una nueva máquina, salida de servicio de otras, etc.). Cualquier cambio de configuración de la red requiere un período de entrenamiento (necesariamente breve) para la Red Neuronal.
La utilización de Redes Neuronales en el diseño de algoritmos proactivos para mejorar el balance de cargas de un sistema distribuido consiste en una idea original, planteada por este proyecto.
La principal desventaja de los métodos estadísticos tradicionales consiste en imponer restricciones inherentes a cada método, lo cual limita su aplicabilidad. Como ejemplo, los Métodos de Regresión Lineal solamente serán efectivos si la relación funcional subyacente en los datos consiste en una función lineal. La introducción de este tipo de restricciones usualmente hace más rígido al método, disminuyendo su capacidad de predicción.
Los métodos basados en Redes Neuronales proporcionan una alternativa robusta para el análisis de datos. Estos métodos no consideran restricciones de ningún tipo para la relación funcional subyacente, ya que se ha probado que modificando la estructura de la Red Neuronal es posible ajustar datos a prácticamente cualquier función.
Una Red Neuronal se organiza en capas, la primera de las cuales es directamente estimulada por (es decir, recibe como entrada) los datos disponibles u observados (ver figura 4.5). Cada capa restante se compone de un conjunto de neuronas, cada una de ellas estimulada por una combinación lineal de las salidas de la capa precedente. La salida de la neurona es obtenida aplicando una función de transferencia a su entrada.
La función de transferencia puede elegirse entre un conjunto amplio, ya que la teoría no plantea más que moderadas restricciones para la misma. Usualmente tienen como dominio el eje real, y como codominio un rango determinado (normalmente [0,1] ó [-1,1]). Una de las funciones de activación más utilizada es la función logsig ([DEBE94]), determinada por:
donde los parámetros wij (llamadosconexiones sinápticas) deben ser determinados para cada neurona. Dos propiedades importantes han difundido el uso de esta función: el escalado de valores al rango [0,1] y el hecho de que su derivada varíe suavemente en los extremos del intervalo y tenga variaciones considerables en el centro del mismo. Para escalar los valores al rango [-1,1] se utiliza como función de transferencia la función tanh (tangente hiperbólica), la cual mantiene la propiedad de las derivadas anteriormente mencionada. Este último hecho brinda a las gráficas de las funciones una forma de "S", por lo cual se les conoce como funciones sigmoides de transferencia. La elección de la función de transferencia no impone ninguna restricción sobre la función a ajustar y ha sido demostrado ([CYBE89]) que el desempeño de la red no es afectada por la elección de la función de transferencia.
El uso de Redes Neuronales para el ajuste de datos requiere un proceso de entrenamiento. Este proceso consiste en la determinación de los coeficientes aij y de los valores ni(j), el cual se realiza sobre un conjunto representativo de datos. El objetivo de esta etapa es minimizar el Error Medio Cuadrático (EMC) del valor de salida de la Red:
Donde incluye simbólicamente a todos los pesos (parámetros) asociados las neuronas de la red. N es el número de casos en el proceso de entrenamiento, y ai y RNi representan al valor real y al valor predecido para el evento i-ésimo, respectivamente. El conjunto de parámetros que minimiza el EMC es comúnmente hallado por medio de una estrategia iterativa (gradiente conjugado, máxima pendiente, etc.). El principal inconveniente de este enfoque es que los métodos iterativos son usualmente incapaces de determinar si el mínimo hallado consiste en un mínimo local o global. Diversas estrategias de entrenamiento han sido desarrolladas recientemente para evitar este problema, entre ellas pueden citarse las técnicas basadas en Algoritmos Genéticos, las que serán útiles en caso de implementarse el método dentro del código PVM.
El número N es en sí mismo parte de la estrategia de entrenamiento. Dado que Cybenko [CYBE89] ha probado que la Red Neuronal es capaz (bajo hipótesis muy generales) de ajustar arbitrariamente bien cualquier función, se corre el riesgo que lograr excelentes resultados con los datos disponibles, y fracasar estrepitosamente con otros datos. La capacidad de lograr buenos resultados con datos que no participaron en el proceso de determinación de los pesos w se denomina generalización. Para lograr un buen ajuste preservando aún la capacidad de generalización, se procede de la siguiente forma. Se subdivide el conjunto de datos disponibles en dos partes, denominados conjunto de entrenamiento y conjunto de validación. El primero (de N elementos) es utilizado tal como se ha descrito, tratando de encontrar los pesos óptimos. Una vez hallados los mismos, se enfrenta a la red a los datos del conjunto de validación, y se evalúa su capacidad de estimarlos. Si el EMC(w) da valores comparables en ambos conjuntos, se acepta el w obtenido. Si no es así, se puede indistintamente: a) intentar comprobar que el w hallado sólo correspondía a un mínimo local de EMC(w), y/o b) modificar la arquitectura de la red, variando el número y tipo de las neuronas o incluso el número de capas ocultas, reiniciando todo el proceso.
En la práctica, lo que se hace es repetir la opción a)
muchas veces, y sólo en último caso ir a b). Usualmente,
los algoritmos de minimización parten de un punto inicial elegido
al azar, por lo que repetir la opción a) consiste simplemente en
correr varias veces el algoritmo de optimización y quedarse con
el mejor de los resultados. Así se procedió en este trabajo.
Para realizar una comparación justa es necesaria la ejecución de programas distribuidos exactamente bajo las mismas condiciones externas de carga. De ese modo es posible garantizar una comparación libre de influencias externas, para determinar si un cierto algoritmo de despacho es mejor que otro. Con esta finalidad, se diseñó un programa informático capaz de cargar artificialmente las máquinas de la red.
El objetivo del programa es replicar la carga que tuvieron N ET conectadas en red en un intervalo de tiempo determinado. Para ello, se dispuso de las series históricas con datos de carga reales para ET de las 2 redes universitarias relevadas (la red uruguaya y la red sueca). Los datos relevados fueron descritos en 4.1 (Recolección de los datos de carga). El problema se podría plantear de la siguiente manera:
Entrada:
a) N series temporales (discretizadas en instantes Ti), con valores de
1) uso de CPU en el instante Ti.
2) uso de DISCO en el instante Ti
3) eventualmente otras medidas de uso de una ET
b) N ET conectadas a la red, pero con carga "menor"
Salida: Las N ET cargadas según los datos de las series temporales.
Una vez resuelto este problema, tendremos creada la infraestructura
necesaria para poder comparar en forma realista las virtudes y defectos
de diferentes algoritmos de despacho de tareas.
Dicha información es accesible a aplicaciones mediante system-calls. En las distintas implementaciones del sistema operativo se utilizan estructuras propietarias para esto. En los Unix SVR4 se utiliza el filesystem /proc, en BSD4.3 se utilizan las system-calls pvkm. En todas estas variantes existe la system-call rstat(), que brinda información sobre todos los parámetros de carga del sistema. Los mismos se describen en la Tabla 5.1.
Estos parámetros no son los únicos que pueden obtenerse en un sistema Unix. Usando funciones como rup o sar es posible obtener detalles más específicos sobre alguno de los parámetros que aquí se muestran. [UNIX] [SUNOS].
Sin embargo la utilidad de los mismos en el contexto de
este proyecto es cuestionable, porque para aprovechar dicha información,
inevitablemente, habría que implementar rutinas específicas
que estén muy vinculadas a la implementación del kernel.
|
|
|
Cp_time | Cantidad de operaciones por segundo (máx. 100) | Porcentaje de uso de CPU. Array con valores de carga de usuario, nice, sistema, y idle. |
Dk_xfer | Cantidad de bloques I/O | Valor de uso de disco locales. |
Pgpgin | Cantidad de páginas | Páginas leídas de disco |
Pgpgout | Cantidad de páginas | Páginas grabadas a disco |
Pswpin | Cantidad de páginas | Swapping Páginas de swap leídas |
Pswpout | Cantidad de páginas | Swapping Páginas de swap grabadas |
V_intr | Cantidad de Interrupciones | Interrupciones hechas a procesos corriendo |
If_ipackets | Cantidad de paquetes | Paquetes recibidos por el dispositivo de red |
If_ierrors | Cantidad de errores | Errores detectados en los paquetes recibidos |
If_opackets | Cantidad de paquetes | Paquetes enviados por el dispositivo de red |
If_oerrors | Cantidad de errores | Errores en la recepción de datos. |
If_collisions | Cantidad de colisiones | Colisiones detectadas en la red. |
V_swtch | Cantidad de cambios de contexto. | Cambios de contexto de procesos en estado running. |
Avenrun | Cantidad de procesos | Promedio de carga del equipo en los últimos 1, 5 y 10 minutos, medido como el promedio de procesos corriendo en dicho período de tiempo. |
Boottime | Segundos desde epoch. | Hora de booteo del equipo |
Curtime | Milisegundos | Hora actual, en formato struct timeval |
Estos datos pueden almacenarse en un archivo para mostrar la misma información de forma gráfica.
La Figura 5.1 es un ejemplo de medición de parámetros
de carga del equipo Multivac durante 20 segundos, usando el programa Procmeter
(Linux 1.2.13). Los parámetros medidos fueron CPU, Disco, Paquetes
enviados y Swap. El criterio definido para elegir los parámetros
a utilizar en la réplica se expone en la siguiente sección.
Otro aspecto a considerar es la variación observada de los parámetros. No es útil replicar parámetros cuya variación es despreciable en el tiempo, porque aumentará el uso de CPU. En algunos casos puede ser mayor la carga generada de CPU que la que se intenta replicar. Además, se torna difícil medir estos valores debido a que los mismos reflejan episodios esporádicos de corta duración (milisegundos).
Además, es posible que algunos parámetros reflejen limitaciones de hardware, las cuales pueden no estar presentes en otros equipos. Por ejemplo: la falta de memoria RAM se refleja con un aumento de los valores de swapping y paging medidos en el sistema. Otros factores, como caches de disco muy grandes instalados en el sistema pueden contribuir a la falta de memoria.
Los factores antes mencionados pueden representar la diferencia entre lecturas de carga tomadas en distintos equipos, la cual es totalmente dependiente de la configuración de cada sistema.
Con la intención de definir un criterio amplio en la elección de parámetros, que permita elegir aquellos que sean representativos para cualquier sistema independientemente de su configuración, se dejarán de lado los parámetros que se encuentren en las consideraciones anteriores.
Si bien este es un criterio arbitrario y no tan objetivo como se desea, es posible elegir los parámetros más obvios y medir los resultados obtenidos, y en función de estos evaluar la necesidad de agregar a la réplica algún otro.
La Figura 5.2 muestra la totalidad de los parámetros que se pueden medir en el sistema. En particular, estos son los medidos con la función perfmeter. Esta medición fue tomada en un período de carga normal del sistema, durante 50 segundos.
Como se puede apreciar, muchos de los valores son casi cero, y algunos tienen muy poca variación en el tiempo. Esto también se observa en los archivos de carga histórica, lo que muestra la representatividad de algunos de estos parámetros con el fin de la réplica.
Basándose en estas observaciones y las anteriores, se tomarán los datos de carga de CPU, Disco y Red como los más representativos y serán los que se intentará replicar. Con esta decisión se podría plantear una interrogante: ¿Por qué se descartan parámetros que involucran operaciones complejas y tardan varios ciclos de reloj (ej.: swap) y se toman en cuenta otros que representan valores al instante de la lectura,que varían al instante siguiente (ej.: CPU, red)?.
Figura 5.1 - Lectura de parámetros con procmeter
La clave para responder a la misma está en que si bien algunos parámetros son medidas de hechos específicos al momento de la lectura (swap, paging), los elegidos miden acciones de los distintos procesos ejecutándose en ese momento en el sistema, incluyendo otras acciones del sistema que se reflejan en otros parámetros de forma más específica. Por ejemplo, el uso de CPU incluye la ejecución de procesos del sistema encargados de realizar el movimiento de datos de memoria a disco (swap), etc. Por esto elegimos sólo estos tres parámetros, por representar un aspecto de la carga global del sistema, dejando de lado otros, dependientes en su mayoría de la configuración del mismo.
A modo de ejemplo, se mostrarán los valores de carga de CPU y disco de dos equipos con distinta configuración corriendo el mismo proceso, sin otra carga adicional. La prueba consiste en crear una matriz aleatoria de 32MB utilizando Matlab. En la Figura 5.3 se ofrecen los resultados. En la primer gráfica se utilizó el equipo dynsys.fing.edu.uy (Sun Sparc con 32Mb de RAM), mientras que en la segunda se utilizó el equipo bmw.fing.edu.uy (Sun Sparc con 64 Mb de RAM).
Figura 5.3 Comparación de la carga generada
por
un mismo proceso en equipos de distinto porte
La misma consiste en leer la carga actual e histórica, y en función de estos valores tomar la decisión de cargar, descargar o no hacer nada. Luego de invocar a la rutina correspondiente, espera hasta el siguiente intervalo de lectura.
El procedimiento de descarga no siempre dará resultado. El enfoque elegido para esto, como se comentó anteriormente, tiene como fin disminuir carga artificial generada previamente por el proceso de réplica, y no intentar disminuir la carga presente en el sistema por otros procesos de usuario.
Chequear parámetros
Acceder a la región de memoria compartida (SMR) Loop Leer carga actual (c_actual) Leer carga histórica a replicar (c_hist) Si (c_hist c_actual) > 0 Invocar procedimiento de carga Sino Invocar procedimiento de descarga Esperar (siguiente intervalo de réplica T_REPLICA) Si (llegó siguiente T_LECTURA) Paso al siguiente valor histórico Fin loop |
Un detalle adicional puede presentarse con réplicas prologadas. El esquema planteado supone despreciable el tiempo perdido en realizar las operaciones del loop, antes de realizar la espera. Experimentalmente se obtuvieron valores del orden de 5 milisegundos en dichas operaciones en sistemas Linux. Esto indica que cada 200 iteraciones hay un desfasaje de un segundo de la carga generada con respecto a la histórica.
Se puede mejorar esta demora, tomando el tiempo antes de cada espera y calculando cuando será el próximo intervalo, en función de T_REPLICA. Antes de esperar hay que recalcular el tiempo de espera como la diferencia entre la hora leída y la hora del próximo intervalo, y utilizar ésta diferencia como intervalo a esperar en vez de T_REPLICA. De esta forma, la espera descuenta el tiempo perdido en las operaciones dentro del loop.
Este ajuste es incluido en el programa de réplica implementado. El programa específico de carga de cada parámetro se describe a continuación.
La variable pcarga tiene el porcentaje de carga que se desea obtener, pausa tiene el tiempo (en microsegundos) que el proceso quedará esperando hasta comenzar el nuevo loop y tx la duración del loop de carga. Como se ve en la primer línea, su duración es proporcional al valor de pcarga.
Se destaca que si pcarga=100, entonces tx = T_REPLICA (El loop dura todo el intervalo). Si pcarga=0, tx=0 y pausa=T_REPLICA. (No hay loop).
Para determinar el valor de T_REPLICA se creó un programa llamado
LoadCPU
y se probó con distintos valores. Los valores con un (*) fueron
obtenidos como promedio en un intervalo de 4 segundos, porque el valor
obtenido en cada lectura era oscilante.
tx = pcarga * (T_REPLICA/100);
pausa = (pcarga>100)? 0: ((100-pcarga) * (T_REPLICA/100)); while (1) { /* Quedo cargando hasta que me maten ..*/ /* Cálculo
hora actual, en microsegundos */
/* Cálculo
tiempo final segun el intervalo dado */
/* Trabajo
hasta llegar al porcentaje pedido.. */
|
En la Tabla 5.2 se observa que prácticamente
no hay diferencias en la carga generada con los distintos intervalos, salvo
con aquellos muy pequeños. Las diferencias obtenidas con intervalos
de 1 y 2 segundos con carga 50 pueden ser por errores en la medición
de la carga generada, la cual debería tomar una muestra por segundo.
Con valores de carga pequeños, como es este caso, incluir algunos
milisegundos más de carga de CPU puede aumentar el valor promedio
de carga leído. En casos en que la carga es grande (caso de 90)
este desfasaje pasa desapercibido en el promedio de carga leído.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tabla 5.2 Valores de carga para determinar intervalo de réplica de CPU.
Por estos motivos el valor del intervalo no debe incidir
en la carga generada. A efectos prácticos se utiliza un intervalo
de 0,5 segundos para los resultados expuestos en este documento, salvo
que se especifique. El mismo se incluye en el archivo de constantes comunes,
para que se use por todos los programas creados.
Con este proceso de carga de CPU, sólo resta por
evaluar los resultados obtenidos usando un único proceso de replica
y una lista de procesos.
Se busca verificar que la suma de carga de los distintos procesos de carga genera la carga total del sistema. Se creó el programa de test llamado suma_CPU, el cual corre varios procesos de carga de CPU de forma serial (uno inmediatamente después de otro), con el valor del intervalo de réplica (T_REPLICA) obtenido en el punto anterior. La Tabla 5.3 muestra los resultados obtenidos cambiando la cantidad de procesos de carga utilizados y los valores de carga de los mismos. Los valores de carga generada son el promedio de carga tomada durante 20 segundos.
|
Procesos |
|
Esperada(%) |
Generada (%) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Utilizando intervalos pequeños, menores a los intereses de este proyecto, se observa que esta diferencia puede ser debida a falta de sincronización de la carga artificial generada por los distintos procesos. Para que la suma de las cargas sea igual a la generada deberían sincronizarse los tiempos de carga y espera de cada proceso de carga, y comenzar todos estos procesos en el mismo instante con precisión de microsegundos, ya que es el orden de magnitud de los intervalos.
En la Figura 5.6 se muestra este problema. La lectura
de la carga generada varía dependiendo del intervalo que se utilice
para esta lectura. Los intervalos de réplica se toman intencionalmente
menores y proporcionales al intervalo de lectura. En el ejemplo, el intervalo
de lectura de carga sería de 4*Ti. El valor de carga leído
es el total de carga generada desde la última lectura. En el ejemplo,
el valor leído en T5 es de 300 %. Como no se tiene referencia al
valor de carga de T2, T3 y T4, se toma el valor de los mismos como el promedio
del valor en T5. Esto da un resultado de 75%, cuando en realidad se quería
obtener una carga del 100%.
Figura 5.6 Relación entre suma de cargas e intervalo de réplica
Este problema debe tenerse presente en el momento de parametrizar los programas de réplica, si se utilizan intervalos pequeños (del orden de microsegundos) y esta implementación de réplica de CPU. Otro factor que puede explicar esta diferencia es las operaciones de cambio de contexto que debe realizar el kernel para intercambiar los distintos procesos en ejecución. Al aumentar la cantidad de procesos en ejecución, se incrementa la cantidad de cambios de contextos, y se desfasa la ejecución de los procesos de carga, modificando de esta forma el tiempo que los mismos utilizan para realizar la operación de carga.
Al margen de estas consideraciones teóricas, se implementó un programa de réplica de CPU, llamado rcpu2. El mismo lleva el control de procesos creados con una lista. Luego de evaluar la diferencia de carga actual e histórica, decide si crear otro proceso de carga o matar alguno de los existentes. En caso de tener que reducir la carga con un valor que no se tiene entre los creados, se mata el proceso que más se aproxime a dicho valor de carga y se crea uno nuevo con la diferencia. Este procedimiento se repite mientras haya exceso de carga, hasta que se hayan eliminado todos los procesos que se crearon.
De esta forma, con la carga histórica de la Figura 5.7, se obtuvo
el resultado de la Figura 5.8. Las mismas muestran los valores de carga
leídos con el programa colector, con intervalo de lectura de 1
segundo y 60 segundos respectivamente. En el primer caso la gráfica
de valores históricos coincide con su gráfica de carga de
CPU, debido al intervalo usado.
Figura 5.7 Carga de CPU original, con intervalos de 1 y 60 segundos.
El resultado obtenido se ajusta muy bien a los datos originales. En
la prueba con intervalo de lectura de un segundo, el promedio del valor
absoluto de desviación en cada intervalo fue de 5,5. La desviación
máxima de la carga generada con respecto a la histórica fue
de 36 en una ocasión, y la mínima de 0 en 6 ocasiones.
Figura 5.8 Carga de CPU generada con lista de procesos de carga
Con el intervalo de 60 segundos se obtuvo una desviación promedio de 0,97 por segundo. La desviación máxima fue de 5 en una ocasión, y la mínima de 0 en 20 ocasiones.
Se observa que ambos resultados tienen pequeños márgenes de desviación con respecto a los datos originales, siendo la réplica con intervalo de lectura mayor la que mejor se ajusta a los mismos.
Figura 5.9 Desviación promedio en la generación, por segundo.
Usando un intervalo de lectura de datos de 1 segundo, se obtuvo un promedio del valor absoluto de desviación de 5,36. La desviación máxima de la carga generada con respecto a la histórica fue de 33 en dos ocasiones, y la mínima de 0 en 11 ocasiones. Con el intervalo de 60 segundos, se obtuvo una desviación promedio de 0,74 por segundo. La desviación máxima fue de 3 en tres ocasiones, y la mínima de 0 en treinta ocasiones.
Ambos resultados se ajustan mejor a los datos originales, que el obtenido con el esquema anterior. Se observa que los resultados obtenidos con intervalos de lectura amplios son mucho mejores que los obtenidos con intervalos más pequeños, confirmando de esta forma las observaciones hechas en capítulos anteriores sobre las dificultades de la generación al milisegundo con este enfoque.
Figura 5.11 Desviación promedio en la generación, por segundo.
Además de esta diferencia, existen detalles inherentes al parámetro, en este caso el Disco. Para generar carga es necesario escribir datos al Disco. Como no se implementarán funciones en el kernel para el acceso al dispositivo, es necesario usar las system-calls create y write en vez de las funciones fprintf y fopen provistas por la biblioteca standard de entrada/salida stdio.
Hay algunos detalles a decidir en la implementación. Ellos son el tamaño del buffer de datos a usar, y los datos que éste tendrá. Confirmando las dificultades que plantea esta solución para obtener buenos resultados, se hace notar que estos detalles son dependientes del sistema, y que indefectiblemente contribuirán al aumento de carga de CPU. El tamaño del buffer a usar para escribir datos definirá la cantidad de accesos a disco que luego hará el kernel. También incidirá en la cantidad de bytes que el kernel transferirá del área de usuario al caché, y luego del caché a disco, variando la cantidad de CPU utilizada en este procedimiento.
Por otro lado, si existiera alguna técnica más sofisticada por parte del kernel para decidir si los datos del caché deben ser volcados al disco, o en el dispositivo mismo, es posible que haya que cambiar el patrón de los datos a grabar, para que no sean siempre los mismos. Estas consideraciones dejan de tener sentido si se utilizara directamente la función del kernel que escribe del caché a disco. No se necesita crear datos en el cache, puesto que se podría utilizar siempre los que están en él.
En la Figura 5.12 se muestra el código usado en
el momento de cargar. El procedimiento de carga esta incluido en el proceso
de réplica. No se crea un nuevo proceso de carga cómo en
el caso de uso de CPU, para simplificar la réplica y minimizar el
uso de CPU generada por éste proceso de réplica.
tx = pcarga* (T_REPLICA/100);
printf ("CARGANDO.. %d, tiempo=%ld\n", pcarga, tx); gettimeofday (&tv, NULL); /* Para usar microsegundos*/ tf.tv_usec = (tx + tv.tv_usec) % 1000000; tf.tv_sec = tv.tv_sec + (tx + tv.tv_usec) / 1000000; while ((tf.tv_sec > tv.tv_sec)
|| (tf.tv_sec == tv.tv_sec
/* Creo archivo
temporal */
|
La estructura es similar a la usada por el proceso de réplica de CPU, en cuanto a los intervalos. Las variables de control tienen el mismo significado que en el proceso anterior: pcarga tiene el porcentaje de carga que se desea obtener, pausa tiene el tiempo que el proceso quedará esperando hasta comenzar el nuevo loop y tx la duración del loop de carga.
El intervalo de réplica a usar se debe determinar siguiendo el mismo criterio que en la réplica de CPU, evaluando los resultados obtenidos con distintos valores del mismo.
Con los distintos intervalos probados experimentalmente la carga generada es acotada, y aunque existe una relación entre el valor de carga pedido y el obtenido, la misma no es lineal.
La figura 5.13 muestra los resultados obtenidos, utilizando un intervalo de lectura de datos históricos de 1 segundo y de réplica de 0,5 segundos. Se obtuvo una desviación promedio de 9,5 por segundo. La desviación máxima fue de 59 en una ocasión, y la mínima de 0. Si bien estos valores no son numéricamente altos, si lo son en relación con la discreción de los datos originales. En este experimento se aprecia una cota de la carga generada de 20, y 40 en una ocasión. En todos los casos que la carga original fue superior a 20, una sola vez se generó una carga superior a 20.
Este problema puede explicarse considerando las operaciones involucradas al grabar datos a disco. Se utilizan las system-calls de dispositivos de bloque, las cuales cuentan con un buffer para mejorar el desempeño de uso del dispositivo. Aunque se evita el uso del buffer de usuario provisto por las funciones de la biblioteca de entrada y salida standard, esto podría no ser suficiente.
Figura 5.13 Carga de Disco original y generada
Es de suponer que si se interactuará directamente con el controlador de disco, sin pasar por el caché del kernel, se podrían obtener mejores resultados, y disminuir la carga de CPU adicional generada por el kernel manipulando los datos del cache. Obviamente esto representa una complejidad mayor que planteada para resolver este problema.
Otro factor que puede explicar los resultados obtenidos
es una incorrecta interpretación de los valores de carga de disco,
y/o de la carga generada.
La generación artificial de carga en la red implica el envío de paquetes a través de la misma. Para el envío de mensajes se utilizan sockets, como se definió anteriormente. Esto implica tener un programa servidor y otro cliente de réplica, de forma que el cliente sea el encargado de generar la carga y el servidor de controlar que la misma se está generando.
Se implementaron el cliente y el servidor de modo que sea parametrizable el uso de circuitos virtuales o datagramas (comunicación con conexión y sin conexión, respectivamente). El servidor acepta hasta 3 peticiones de conexión, y crea un hijo que es el encargado de recibir los paquetes que llegan por la misma. El padre sigue atendiendo el socket, esperando otras posibles conexiones.
Si bien esto último no se utilizará en el sistema de réplica, esta implementación permite gran escalabilidad a la hora de agregar futuras mejoras. Fácilmente, sin mayores modificaciones del código fuente del programa, se puede incorporar alguna técnica de control de los mensajes recibidos, así como también aceptar mensajes de varios procesos clientes en la red enviando datos al mismo servidor.
Parte del código del proceso servidor se incluye en la figura
5.14.
do {
if ((ns = accept(sd, 0, 0)) == -1) perror("fallo el accept"); else if (fork()
== 0) {
} while (1); |
Figura 5.14 Esquema del proceso servidor de réplica de Red
El proceso cliente tiene el mismo esquema que el descrito en 5.4 - Proceso de réplica usado en la réplica de todos los parámetros. En este caso se agrega la conexión con el socket del servidor antes de acceder a los datos históricos en memoria compartida. La operación de carga implementada en el cliente es la descrita en la figura 5.15.
Este esquema no tiene presente el intervalo de tiempo
que lleva el envío de los pcarga paquetes a través
de la red, que se supone despreciable con relación al intervalo
de carga que se utiliza. Este también es arbitrario, y se debe elegir
lo suficientemente grande de forma que permita la utilización de
la red por otros procesos, ya que esta podría llegar a saturarse
y se generarían colisiones todo el tiempo, si el intervalo usado
en la réplica es muy pequeño.
for (j=1; j<pcarga; j++)
{
if (stipo == SOCK_STREAM) /* Se usan conexinoes */ envio_mal = (write(sd, mensaje, strlen(mensaje)) < 0); else /* Se usan datagramas */ envio_mal = (sendto (sd, mensaje, sizeof(mensaje), 0, (struct sockaddr *) &server, sizeof(server)) == -1); if (envio_mal) perror ("Cliente: Error al enviar en el socket"); } |
Figura 5.15 Esquema del proceso cliente de réplica de Red
Por esto se toma el valor del intervalo igual que el usado en los demás procesos de réplica (0,5 segundos), el cual debe aumentarse en caso que se observen muchas colisiones en la red.
La Figura 5.16 muestra la carga de red obtenida junto con la carga original, con un intervalo de lectura (T_REPLICA) de 1 segundo. Aquí no es necesario evaluar la réplica con distintos intervalos de lectura porque esto no incide en los resultados.
El promedio del valor absoluto de desviación en
cada intervalo fue de 25 (paquetes/seg). La desviación máxima
de la carga generada con respecto a la histórica fue de 190, y la
mínima de 7 en 8 ocasiones. En este caso siempre hay más
carga generada que histórica, debido a que no es posible encontrar
momentos en que la red esté ociosa, y siempre hay paquetes presentes
en la misma. La desviación promedio es alta, debido a picos en la
cantidad de paquetes presentes en la red en el momento de la réplica.
La decisión de diseño de usar un proceso por cada parámetro a replicar fue buena, según muestran los experimentos de carga de cada parámetro por separado. Cada proceso se adapta a la carga de otros que pueda afectar el parámetro que está siendo replicando por el primero.
A su vez, utilizando distintos intervalos de lectura de datos, se obtienen mejores resultados con intervalos grandes (varios segundos). Esto indica que las hipótesis tomadas para el diseño del proceso de réplica fueron acertadas. Confirma también las suposiciones hechas en cuanto a la dificultad para lograr una buena réplica al milisegundo con este diseño, en comparación con los resultados a obtener con intervalos mayores.
En definitiva, los resultados obtenidos por el sistema de replicación de carga pueden considerarse como muy buenos, y si bien fue ideado como un subproducto imprescindible para cuantificar la bondad de los nuevos algoritmos de despacho desarrollados en este proyecto en particular, su utilización seguramente trascenderá a este proyecto.
Los nuevos algoritmos de despacho debían ser incluidos en el sistema PVM, de modo tal que las aplicaciones distribuidas existentes puedan utilizarlos sin realizar cambios de código, sino a lo sumo recompilando contra la biblioteca PVM modificada.
Los beneficios de los nuevos algoritmos serían corroborados en una etapa posterior mediante un experimento ideado para ejecutar una misma aplicación distribuida sobre condiciones exactamente iguales de carga, utilizando los diferentes algoritmos diseñados. Los tiempos de ejecución de la tarea distribuida en cuestión se compararían entre sí y con los tiempos obtenidos utilizando la estrategia de despacho estándar del sistema PVM.
De acuerdo a lo planteado en las secciones precedentes, y al análisis estadístico de los datos disponibles, se llegó a la conclusión de que en nuestro caso particular no se justificaba la implementación de modelos complejos de predicción, los cuales involucrarían un alto consumo de los recursos del sistema.
Los nuevos algoritmos de despacho basaron su diseño en la modelización
matemática de las series temporales de datos de carga (ver Capítulo
4) lo cual permitió diseñar e implementar métodos
de predicción de la carga futura. En este sentido se diseñaron
e implementaron tres tipos de algoritmos de despacho, basados en los métodos
de predicción que se detallan a continuación.
La estrategia de predicción es muy sencilla en sí, y no involucra el conocimiento de valores históricos de carga, salvo el valor del instante anterior. El modelo de predicción es obviamente inexacto, pues no considera potenciales variaciones de carga externa que pueden afectar sustancialmente el tiempo de ejecución de una aplicación distribuida.
De todos modos, ya fue explicado en la introducción el motivo por el cual los desarrolladores de PVM no han invertido tiempo en la investigación e implementación de métodos de predicción más exactos para incluirlos en los sistemas que proveen ambientes para desarrollar aplicaciones distribuidas. En los países desarrollados, desde donde provienen estos sistemas, es común el uso de computadoras dedicadas o semi-dedicadas para la ejecución de aplicaciones paralelizables. Bajo esta hipótesis es posible considerar que la carga externa no varía sustancialmente, y he ahí la justificación del uso de la predicción naive.
Cabe mencionar que el modelo de predicción naive consiste en un modelo univariado puesto que considera únicamente la carga de la ET a predecir, sin considerar posibles correlaciones con las restantes ET de la máquina virtual.
6.3 Método de predicción
basado en el Método de Mínimos Cuadrados
Una vez determinada la relación considerando un conjunto de datos de instantes anteriores, es posible realizar una predicción de los valores de carga en un intervalo futuro. Con el fin de lograr un buen nivel de predicción para redes dinámicas, se implementó un algoritmo adaptativo, que recalcula los coeficientes, ajustándolos de acuerdo al error cometido en la predicción del tiempo anterior.
El método de predicción mantiene un conjunto de valores de carga de las ET de la máquina virtual en un horizonte de tiempo en el pasado y los utiliza para predecir la carga en el instante futuro calculando los coeficientes de la ley lineal utilizada.
El cálculo de coeficientes se realiza considerando exclusivamente
los datos de carga del cada ET en cuestión, por lo cual el método
implementado se clasifica dentro de los métodos
univariados.
El método de predicción naive fue utilizado como predictor de referencia. El método naive ya fue presentado, y consiste en suponer que la carga no varía en el tiempo, es decir y(t) = y(t-1). Este es el método estándar de predicción de PVM al momento de despachar una tarea.
La primer Red ensayada tuvo en cuenta 4 eventos consecutivos para predecir el quinto. La Red tenía una capa oculta de cuatro neuronas y una capa de salida de una única neurona. La topología de esta Red consistía en una capa oculta con cuatro neuronas y función de transferencia lineal, y una capa de salida con una neurona de función de transferencia también lineal. De acuerdo con la nomenclatura utilizada, una red de este tipo se denomina 4p1p, haciendo referencia al número de neuronas en la primer capa, la función de transferencia utilizada (p para función lineal) y similar para la capa de salida.
Al ser las funciones de transferencia lineales, es posible demostrar que estas redes tienen un óptimo único, lo que facilita grandemente su entrenamiento. Los resultados obtenidos se ofrecen en la tabla 6.1 donde EntrRMCE representa la RMCE obtenida al predecir utilizando el conjunto de entrenamiento. La columna TestRMCE reúne los valores de la RMCE obtenidos al utilizar el conjunto de verificación. La columna TotalRMCE ofrece los valores de RMCE calculados utilizando la totalidad del conjunto de datos para la predicción. Maxerr y Minerr son los máximos y mínimos errores cometidos en la predicción. Como referencia para cuantificar la mejora, se ofrece el valor que estima el método Naive.
El siguiente paso consistió en cambiar la arquitectura
de la Red, variando la función de transferencia utilizada en las
capas ocultas. Fueron consideradas varias topologías, primero en
el caso de funciones lineales de transferencia (Redes 8p1p, 6p6p1p,
16p4p1p) cuyos resultados se ofrecen en la tabla 6.1.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tabla 6.1: Resumen de los resultados para las Redes
Neuronales
que utilizan funciones de transferencia lineales.
Luego se introdujeron funciones de transferencia no lineales (Redes 4t1p, 8t1p, 4t4t1p, 6t6t1p, 4t8t1p, donde la letra t representa una función sigmoide de transferencia) y la red bp11ya utilizada en otros proyectos como herramienta de predicción [LOPE97b]. Su estructura consiste en una única capa oculta, con 6 neuronas y función de transferencia tansig, y una capa de salida con función de transferencia lineal. Los cinco valores de entrada de la red consisten en los valores de carga de los cuatro instantes de tiempo anteriores y el valor de carga actual.
Los resultados obtenidos para funciones no lineales de
transferencia figuran en la tabla 6.2. Del análisis de los resultados
obtenidos para el caso univariado es posible concluir que no se obtuvieron
beneficios muy significativos al aplicar redes con topologías más
complejas. Con la red 4t1p fue posible obtener una mejora
del 14,5% al comparar con la predicción
Naive, mientras que
con la red bp11 fue posible obtener una mejora del
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tabla 6.2: Resumen de los resultados para las Redes
Neuronales
que utilizan funciones de transferencia no lineales.
Para completar el análisis de predicción, fue necesario repetir el análisis para otras máquinas representativas de la red de Facultad. Los resultados obtenidos corroboraron las conclusiones a las cuales se arribó en el caso de la máquina dynsys.fing.edu.uy.
Complementariamente se utilizaron las redes entrenadas con la carga
de dynsys.fing.edu.uy para predecir la carga de otra máquina
saddle.fing.edu.uy.
Los resultados obtenidos se detallan a continuación, en la tabla
6.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tabla 6.3: Desempeño de la red entrenada
en dynsys.fing.edu.uy utilizada para
predicciones de carga en canada.fing.edu.uy, sin reentrenamiento.
Las predicciones realizadas utilizando la Red "prestada" (es decir, entrenada con datos de carga de otra máquina) obtuvieron valores mayores del error, pero dentro del mismo orden de magnitud para máquinas relacionadas entre sí. (ver Capítulo 4, sección 4.3.4). Este hecho puede ser explicado argumentando que máquinas de este tipo comparten el mismo perfil de usuarios, ejecutando aplicaciones similares, y con valores de carga que muchas veces son similares.
Para el caso de máquinas sin vinculación, los valores
obtenidos por predicción utilizando la Red "prestada" tuvieron errores
considerablemente más grandes en comparación con los valores
obtenidos utilizando una red propietaria. Tal es el caso de las máquinas
canada.fing.edu.uy.
y dynsys,fing.edu.uy. Tal como se mencionara en el capítulo
4, sección 4.2.4, esta última es una máquina muy utilizada,
que funciona como servidor de disco, y cuyos valores de carga son habitualmente
altos, lo cual no es característico de canda,fing.edu.uy. Los resultados
se ofrecen en la siguiente tabla 6.4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tabla 6.4: Desempeño de la red entrenada
en dynsys.fing.edu.uy utilizada para
predicciones de carga en canada.fing.edu.uy, sin reentrenamiento.
Como conclusión del análisis de los resultados obtenidos utilizando el enfoque univariado, fue posible concluir que el uso de topologías complejas de Redes Neuronales univariadas ofrece resultados que apenas superan en precisión a las Redes de arquitectura sencilla (4p1ppara el modelo lineal y 4t1p para la no lineal). Dentro de las topologías que utilizan funciones de transferencia no lineales, el mejor resultado fue logrado utilizando la red bp11.
Otro resultado importante (que habrá que confirmar en más
casos) es que máquinas con similares patrones de carga pueden compartir
sin demasiado problema la misma red neuronal para la predicción.
La cualidad de "similares patrones" se comprueba por la aplicación
del test de Kolmogorov Smirnov, el cual es muy económico en términos
de cálculo. Para máquinas con diferentes patrones de carga
se hace necesaria la utilización de redes propietarias para lograr
una precisión adecuada en la predicción de valores futuros.
Los análisis fueron realizados para la red denominada bp11 ([LOPE97b]), cuya arquitectura fue descrita en la sección anterior y la cual demostró ser una herramienta de predicción multivariada aceptablemente precisa. En este caso los cinco valores de entrada de la red consisten en la estimación de carga (obtenida por parte de la primitivarstat()) del conjunto de máquinas en el instante anterior, y la salida la estimación del valor de carga futuro para la ET en cuestión.
Para cada ET de la máquina virtual debe ser entrenada una red diferente utilizando los datos de carga de todas las máquinas de la red, lo cual determina que el proceso de entrenamiento sea engorroso. En el caso del CeCal se trabajó sobre un conjunto de 5 máquinas, por lo que se generaron parámetros para 5 redes de topología bp11.
Para el caso multivariado el entrenamiento se realizó utilizando un tercio de los datos disponibles como conjunto de entrenamiento.
Los resultados obtenidos se detallan a continuación, en la tabla 6.5, comparados con el resultado de la predicción Naive como referencia. Las funciones de transferencia utilizadas incluyeron a las funciones purelin y tansig, las cuales se hallan definidas en ([DEBE94]).
El análisis demostró que se logra una mejora
pequeña pero significativa utilizando el enfoque multivariado para
diseñar el predictor, con relación al enfoque univariado.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tabla 6.5: Resumen de los resultados para la Red
Neuronal multivariada,
que utiliza una función de transferencia no
lineal.
Para cada ET (del conjunto de 5 formado por las máquinas saddle.fing.edu.uy, guille.fing.edu.uy, cecal.fing.edu.uy, dynsys.fing.edu.uy y canada.fing.edu.uy) se utilizaron a su vez 5 redes tipo bp11 para predecir la carga en los instantes futuros de 1 a 5 minutos respectivamente, con la idea de utilizar la información intermedia en el criterio de despacho. En total pues, fueron necesarias 25 redes diferentes.
A su vez, la falta de flexibilidad de la red multivariada implica la necesidad de recalcular los coeficientes cuando se modifica la configuración de la máquina virtual. El proceso de entrenamiento puede resultar lento y costoso, por lo cual se justifica la utilización de modelos de redes univariadas para máquinas virtuales de configuración variable. Complementariamente al enfoque anterior, se utilizó como predictor univariado una Red Neuronal tipo bp11 para cada ET de la máquina virtual.
La elección de la topología de la red estuvo
motivada por la precisión relativamente buena de la red bp11
multivariada como herramienta de precisión. Los datos obtenidos
para cada ET son independientes de las restantes, pero la idea es mejorar
la estimación a futuro mediante una combinación lineal de
las predicciones.
El principal inconveniente de este lenguaje consiste en que, al ser interpretado, no genera código objeto y por lo tanto es necesario el intérprete para su ejecución. El sencillo y rápido desarrollo de los algoritmos en este lenguaje permitió determinar en qué casos los métodos predecían resultados coherentes con la realidad y en cuáles se justificaba mejorar el diseño para incluir un enfoque multivariado.
En el caso del método basado en Mínimos Cuadrados, se corroboró su correctitud y se verificó que la consideración de los datos de carga de otras máquinas afines a una ET determinada para la predicción de su carga, introducía complicaciones en las operaciones y no se lograban mejoras significativas en los resultados.
Diferente fue el resultado obtenido para el método basado en Redes Neuronales. En este caso fue posible experimentar con diferentes modelos de redes (utilizando las funciones del toolbox disponible en Matlab) y concluir que el modelo más apropiado de red dentro de las analizadas fue el modelo bp11 multivariado (ver sección anterior).
Para lograr una solución portable y fácilmente integrable a la biblioteca de PVM, en una segunda etapa se implementaron bajo lenguaje C los métodos que mejor habían estimado la carga futura. El lenguaje C ofrece una solución robusta y amigable, tiene grandes facilidades de integración al código de PVM (el cual se halla implementado en este lenguaje) y además consiste en un lenguaje compilado, que genera código portable.
El principal problema encontrado en la migración de los métodos de predicción que se habían mostrado efectivos en el lenguaje Matlab, al lenguaje C, consistió en la complejidad de algunas operaciones matemáticas, las cuales fueron rediseñadas para evitar problemas numéricos comunes. En particular, fue necesario codificar una versión alternativa de la operación seno hiperbólico para evitar problemas de cancelación catastrófica.
El problema de la rigidez del método basado en la Red Neuronal multivariada fue considerado. En este caso se estudió la factibilidad de implementación de un modelo univariado para máquinas virtuales de configuración dinámica. El modelo univariado no considera posibles correlaciones entre los datos de carga de las diferentes ET. Esto implica que al incluir una nueva ET solamente debe entrenarse su red propia (lo cual puede realizarse de antemano, entrenando redes univariadas para las máquinas más utilizadas para cálculos científicos). Además. la eliminación de una ET de la máquina virtual no requiere de cálculos adicionales.
Esta propiedad de escalabilidad de los métodos de predicción univariados es importante y merece ser destacada.
Los algoritmos de predicción diseñados e implementados fueron ensayados para corroborar su correctitud. La prueba realizada consistió en calcular la diferencia entre los valores de carga estimados y los valores reales, sobre máquinas representativas de la red de Facultad. Los valores correspondientes a experimentos de predicción de carga sobre un conjunto de máquinas que comprendía: maserati.fing.edu.uy, bmw.fing.edu.uy, saddle.fing.edu.uy, dynsys.fing.edu.uy se ofrecen en la tabla 6.6. Los valores de carga considerados se hallaban acotados entre 0 y cien, representando el porcentaje de consumo de CPU sobre cada ET involucrada.
El ensayo involucró la predicción de carga para intervalos de 5 minutos, y se realizó un total de 320 predicciones sobre las máquinas mencionadas, para cada método de predicción.
El método de predicción multivariado basado
en la Red Neuronal bp11 fue el método que mejor logró
aproximar los valores de carga, aunque el error promedio continúa
siendo elevado, en el margen del 10%. En esta etapa no se pretendía
que los resultados de predicción sean exactos, ya que se realizó
una predicción a mediano plazo, con el fin de lograr una estimación
promedial de la carga durante el tiempo de ejecución de una tarea.
La etapa de testeo fue diseñada para determinar que el comportamiento
de los algoritmos de predicción codificados en el lenguaje C conservaban
el comportamiento de los algoritmos originales implementados en Matlab.
|
|
|
|
|
Error promedio |
|
|
|
|
Desviación estándar |
|
|
|
|
Fue posible observar también que los métodos restantes (basados en Mínimos Cuadrados y Redes Neuronales univariadas) funcionaban correctamente, obteniendo una aproximación que superó en cuanto al error promedio a la predicción Naive.
El resultado de predicción obtenido con el método de Redes Neuronales multivariadas puede ser mejorado utilizando Redes Neuronales Adaptativas. Este tipo de redes utilizan el error cometido en la predicción anterior para recalcular los parámetros de la red en busca de obtener un resultado más preciso. Las Redes Neuronales Adaptativas fueron utilizadas para la predicción de la carga y efectivamente lograron una mejora considerable, reduciendo el error promedio al 7,2%.
El principal problema de las redes adaptativas consiste en la dificultad
de implementación del mecanismo de reentrenamiento en lenguajes
de alto nivel. El lenguaje Matlab proporciona funciones para el cálculo
directo de los coeficientes adaptados, resolviendo el problema de optimización
involucrado y retornando los nuevos valores. El diseño de un algoritmo
de predicción basado en Redes Neuronales Adaptativas en lenguaje
C fue abordado, pero debido a las complejidades mencionadas su implementación
ha quedado planteado como un posible trabajo a futuro.
Fueron implementados tres algoritmos
de despacho : uno basado en el método de predicción de Mínimos
Cuadrados, y dos basados en los métodos de predicción de
Redes Neuronales, para el caso caso univariado y multivariado.
El valor considerado como predicción de la carga futura en el intervalo de tiempo considerado se obtiene calculando el área bajo la función aproximante y promediando. El hecho de que dicha función sea una recta simplifica el cálculo de la integral, la cual se realiza en forma exacta, mediante la regla de integración del trapecio. Para la determinación de los coeficientes de la recta se utilizan 8 valores de carga instantánea relevados cada un minuto. La figura 7.1 resume la descripción del método mencionado.
Figura 7.1: Estimación de carga realizada por
el método
de Mínimos Cuadrados.
El método de despacho basado en las Redes Neuronales bp11univariadas considera cinco redes de dicha arquitectura para estimar la carga de cada ET en los instantes de tiempo t+D t, t+2D t, ..., t+5D t.
Las estimaciones para las diferentes ET se combinan linealmente para obtener una estimación de la carga de una ET para cada t+kD t. Es decir, llamando a la estimación de la carga en el tiempo t+kD t para la ET i, el valor estimado para la ET i se expresa como . Los coeficientes coefi,jse calculan aplicando Mínimos Cuadrados de modo de ajustar los valores a una función lineal.
La ventaja principal de este método híbrido consiste en que los valores de predicción de carga ofrecidos por la red neuronal son independientes para cada máquina. Cada red utiliza como entrada valores históricos de carga de una única ET. El resultado de la estimación no depende de la configuración de la máquina virtual y el entrenamiento de la red puede realizarse por anticipado.
Una vez decidida la configuración a utilizar, el cálculo de los coeficientes coefi,j se realiza en tiempo real y dado que la matriz de covarianza es constante, solamente es necesario calcularlo una única vez.
Del modo descrito se logra simular el efecto de correlación constatado entre los valores de carga de ciertas máquinas, evitando la falta de rigidez de las redes multivariadas para el caso de modificaciones en la configuración de la máquina virtual, tal como fue mencionado anteriormente.
El método basado en Redes Neuronales multivariadas requiere del entrenamiento de las redes utilizadas de acuerdo a la red de computadoras utilizada. La falta de flexibilidad de este método radica en la necesidad de un reentrenamiento de la Red Neuronal al momento de modificar la configuración de la máquina virtual (al agregar o suprimir una ET).
El método de despacho determina la ET más adecuado, no mediante una estimación instantánea de carga futura (que podría ser para el siguiente minuto, o para dentro de 5 minutos, por ejemplo), sino que realiza un promedio de los valores estimados a distintos horizontes separados por intervalos regulares, tal como fue explicado para el método de Mínimos Cuadrados . Para ello se utilizan 5 Redes Neuronales bp11 por ET, cada una de las cuales brinda una predicción del valor de carga en el siguiente minuto, dos minutos, tres, cuatro y cinco minutos respectivamente. Los valores obtenidos se promedian (como un caso particular de calcular el área bajo la función de carga utilizando la Regla de Integración del punto medio) y se utilizan para determinar la ET más adecuada al momento de despachar una tarea, asignando la ET con menor carga futura estimada.
Un segundo proceso (el proceso predictor), que se comunica por medio de la memoria compartida con el proceso recolector, el cual contiene la implementación en lenguaje C de los algoritmos de predicción de cargas. Este proceso es el encargado de responder a las aplicaciones clientes del sistema PVM cuando desean iniciar un nuevo proceso. El proceso predictor utiliza la información recolectada por el proceso recolector y determina la carga futura de las máquinas de la red utilizando las estrategias de predicción.
Completa el sistema una biblioteca PVM modificada. Esta
biblioteca contiene en su función de creación y despacho
de nuevas tareas a ejecutarse en paralelo (PVM_SPAWN()),
una consulta al proceso predictor. Teniendo en cuenta la estrategia
de predicción seleccionada (mediante especificación de parámetros
al determinar la configuración de la máquina virtual), la
función de despacho selecciona la ET más adecuado de acuerdo
a los valores entregados por el proceso predictor. La comunicación
entre la biblioteca modificada y el proceso predictor se realiza
mediante sockets. En la figura 7.2 se detalla un diagrama de la
interacción entre los procesos mencionados.
Figura 7.2: Diagrama de la comunicación entre
los procesos
del nuevo sistema de despacho mejorado
La implementación realizada tiene algunos aspectos débiles y fuertes. Entre los primeros, debe mencionarse que la red neuronal debe ser entrenada en forma separada (usando Matlab) por lo que en este momento no sería posible ofrecer para su distribución junto con el resto del PVM una solución completa en forma autónoma basada en nuestros resultados. Otro aspecto relacionado es que para el caso multivariado, la configuración de la máquina virtual (ET involucradas) está rígidamente incorporada en la red neuronal de modo de considerar las correlaciones. No es posible utilizarla con una configuración distinta, y se requeriría un entrenamiento nuevo para cada nueva configuración.
En cambio, es favorable el hecho que el mayor costo involucrado en la aplicación de esta tecnología está en la etapa de entrenamiento, que se realiza offline y una única vez. El uso posterior de la red neuronal ya entrenada sólo requiere modestísimos recursos de cálculo, y se ha incorporado a nuestro código en C.
Las alternativas exploradas para facilitar el uso en una
máquina virtual con mayor flexibilidad en la integración
de sus nodos, constituye el método de despacho basado en una red
neuronal por máquina, que sólo use datos del pasado reciente
de la misma, más un esquema de estimación basado en combinaciones
lineales de las salidas anteriores. Lo primero incorpora la información
temporal, y lo segundo puede recoger la conocida correlación entre
máquinas ya observada. La ventaja fundamental es que la combinación
lineal (vía mínimos cuadrados) es relativamente fácil
de modificar al cambiar la configuración de la máquina virtual,
y el costoso proceso de entrenamiento de la red se realiza por ET, ignorando
las otras, por lo que se realiza una única vez.
Esta prueba consistió en ejecutar un conjunto predefinido de aplicaciones estándar del cálculo científico distribuido utilizando las diferentes estrategias de despacho de tareas, y comparar los tiempos requeridos. Para realizar una comparación justa entre las estrategias de despacho, libre de influencias externas de variaciones de carga, las diferentes ejecuciones de dicho programa debían ser realizadas bajo exactamente las mismas condiciones de carga externa.
El experimento diseñado integró al replicador de carga (capítulo 5) y al sistema PVM modificado descrito en la sección anterior, incluyendo los nuevos algoritmos de despacho de tareas. El replicador fue utilizado para simular sobre las ET de la máquina virtual utilizada la carga histórica disponible de máquinas representativas de la red de facultad. Paradójicamente, para simular cargas en una red no dedicada, fue necesario dedicar la red, debido a la imposibilidad del programa replicador de eliminar carga no producida por la réplica sobre las computadoras seleccionadas como representativas (lo que requeriría privilegios de administrador del sistema). La replica de datos de carga consideró los valores históricos disponibles de consumo de CPU, relavados cada un minuto.
La mejora fue cuantificada comparando contra la estrategia Naive estándar de PVM (que se asume como el peor método), mientras que como referencia óptima se utilizó el método perfecto, que se define enseguida.
En el ambiente de testeo con simuladores de carga es posible anticipar cual será la carga exacta que se tendrá en el futuro, dado que ésta es conocida al momento de replicar. Utilizando esta información es posible implementar el método perfecto, el cual consiste en el mejor método posible, dado que conoce de antemano los valores futuros. La idea de implementación de este método consiste en contar con una referencia para cuantificar la mejora de los métodos implementados sobre la estrategia de despacho por defecto de PVM. Esta comparación debe realizarse considerando la distancia con el método perfecto, bajo el supuesto de que el mismo es comparable en eficiencia con el mejor método posible de despacho de tareas.
Nótese sin embargo que conocer la carga a futuro no implica que se hará un uso óptimo de esa información. El nombre de perfecto no debe interpretarse como que el despacho es óptimo, ya que lo único diferente es que se asume conocida la carga a futuro. Lo ideal sería asignar, entre todas las posibles combinaciones, las tareas a las diferentes máquinas de forma que se logre un tiempo total de ejecución que sea mínimo. Ese mínimo existe (ya que le conjunto de opciones es finito) pero no es conocido, y su hallazgo constituye un desafío a encarar en el futuro.
A modo de ejemplo, una vez asumida la serie temporal de los valores de carga de CPU a futuro, se puede optar por elegir la máquina en la que se despachará teniendo en cuenta únicamente la carga instantánea estimada para dentro de 5 minutos. Otra posibilidad, es seleccionar la máquina cuya carga promedio en los próximos 5 minutos será mínima (lo que implica usar información intermedia). Si se conoce una estimación del tiempo (u operaciones en punto flotante) que requiere la tarea a despachar, sería plausible asignar la máquina luego de realizar la integral de la serie de la carga de CPU, afectarla por un factor que tenga en cuenta la potencia (operaciones por segundo) de la máquina, y decidirse por la que requiera menos tiempo para realizarlas. Estas diferentes alternativas (todas defendibles) muestran que, aún conociendo la serie de carga hacia el futuro, el problema del criterio óptimo de asignación aún subsiste.
El método perfecto toma los datos del área
de memoria compartida utilizada por el programa productor de datos
para la réplica de carga. Tomando un conjunto adecuado de datos
de carga futura (los datos a replicar) de acuerdo a la duración
promedio de las tareas despachadas, es posible determinar de modo casi
exacto el volumen de carga de las máquinas de la red. Bajo este
ambiente fueron testeados los nuevos algoritmos de despacho.
Para considerar los nuevos algoritmos de despacho, fue necesario compilar la tarea distribuida ejecutada contra la nueva versión de PVM, que incluye nuestra biblioteca modificada.
Los resultados de esta prueba preliminar demostraron una pequeña mejora de desempeño, utilizando el tiempo total de ejecución como medida, sobre un total de 50 ejecuciones. La tabla 7.1 resume los resultados obtenidos.
Los valores del tiempo de ejecución corresponden al programa test, ejecutando sobre una carga histórica replicada. El experimento fue realizado considerando 5 máquinas dedicadas sobre las cuales se replicó la carga histórica disponible de 5 máquinas representativas de la red de Facultad.
Como correspondía, primero fue verificado un comportamiento
determinístico (ver capítulo 3) para el programa test para
cada uno de los métodos de despacho utilizados. La desviación
estándar nunca excedió el 3% del tiempo total de ejecución.
|
Promedio del tiempo de ejecución |
|
|
|
Naive |
|
|
|
|
Mínimos Cuadrados |
|
|
|
|
Red Neuronal Univariada |
|
|
|
|
Red Neuronal Multivariada |
|
|
|
|
"Perfecto" |
|
|
|
|
Tabla 7.1: Resultados del ensayo preliminar. Tiempo en segundos.
La cuantificación de la mejora de desempeño lograda por el método perfecto es un resultado importante, que merece ser destacado. Aún conociendo los valores exactos de carga para el futuro, el método perfecto solamente logró reducir el tiempo total de ejecución en un factor del 7,27% sobre el método de despacho Naive. Este resultado sugiere que la estrategia estándar de despacho de PVM es apropiada, al menos para este test.
Teniendo en cuenta el resultado anterior, la estrategia de despacho basada en la predicción de Redes Neuronales logró buenos resultados, tanto para el enfoque univariado como para el enfoque multivariado. En el caso multivariado, se alcanzó más de la mitad de la mejora óptima, acotada por la del método perfecto.
La estrategia basada en la predicción de carga del Método de Mínimos Cuadrados no funcionó satisfactoriamente. Su mejora sobre el método Naive alcanzó el 1,79%, pero este valor cae dentro del rango de incertidumbre dado por la desviación estándar de los tiempos de ejecución de las 50 ejecuciones que conforman el experimento.
Una posible explicación para el hecho anterior consiste en que el método de Mínimos Cuadrados no maneja correctamente las variaciones de datos de carga. Fue posible observar que al ocurrir una variación no esperada en la carga, la aproximación lineal fallaba en su predicción a futuro y además, tardaba en lograr la precisión usual.
El problema anterior no se reflejó para la predicción
basada en Redes Neuronales. El carácter no lineal de la aproximación
elimina la rigidez en la predicción y cuando el método comete
un error, se recupera rápidamente.
Para determinar la mejora de desempeño obtenida, se ejecutó el programa utilizando los diferentes algoritmos de despacho, en condiciones similares de carga..
Los resultados obtenidos confirmaron las tendencias del ensayo preliminar, efectuado con una aplicación paralela pequeña. En algunos casos la mejora de desempeño medida por el tiempo total de demora de ejecución superó los resultados estadísticos obtenidos para el testeo preliminar.
Debido a lo extenso de la aplicación, se utilizaron
para el ensayo definitivo secciones individuales del programa. El promedio
del tiempo de ejecución total de las secciones utilizadas empleando
la técnica estándar de despacho de PVM, fue de 187 minutos.
El tiempo medio de ejecución del conjunto de tareas individuales
(creadas por la sección principal del programa y lanzadas a ejecutar
en forma distribuida) alcanzó un valor de 7 minutos, por lo cual
excedió levemente el horizonte de tiempo de la predicción
(5 minutos). Los datos de carga histórica replicados consistieron
en datos de consumo promedio de CPU relevados cada un minuto. Los resultados
obtenidos se detallan en la tabla 7.2
|
|
|
|
|
Naive |
|
|
|
|
Mínimos Cuadrados |
|
|
|
|
Red Neuronal Univariada |
|
|
|
|
Red Neuronal Multivariada |
|
|
|
|
"Perfecto" |
|
|
23' (14,02 %) |
|
El testeo de fuerza involucró 7 estaciones de trabajos de la red de Facultad, y el número de ejecuciones realizadas para cada método de despacho fue de 20. Los segmentos de programa utilizados se comportaron determinísticamente. La desviación estándar en los tiempos de demora de ejecución se mantuvieron acotadas por el 2,25% del tiempo total de ejecución para cada uno de los métodos implementados.
Los resultados confirmaron la mejora significativa de desempeño lograda por los métodos basados en la predicción de Redes Neuronales. Para el caso multivariado, al igual que en el testeo preliminar, la mejora se ubicó en el entorno del 50% respecto a la mejora lograda por el método perfecto.
Cabe consignar que en este caso fue logrado un incremento sensiblemente superior al utilizar el método perfecto. La mejora en el desempeño alcanzó al 14%, lo cual significa que duplicó el desempeño lograda para el testeo preliminar. Este resultado puede explicarse debido a que la aplicación utilizada crea más tareas por unidad de tiempo que el programa test diseñado para el testeo preliminar, lo cual permite al sistema extraer mejores resultados mediante el conocimiento exacto de los valores de carga futura. Como contrapartida, la duración de las tareas individuales se vio incrementada proporcionalmente a la demora total de ejecución, lo cual introdujo un mayor grado de incertidumbre para los métodos de predicción. De todas maneras, el incremento en la mejora del método basado en la predicción multivariada de carga mediante Redes Neuronales fue digna de resaltar, pasando del 4,05 al 6,25%. (Más de 4 puntos porcentuales por encima de la incertidumbre determinada por el comportamiento casi-determinístico de la aplicación en ejecución)
Nuevamente el algoritmo de despacho basado en la estrategia de predicción de Mínimos Cuadrados tuvo dificultades para lograr una mejora significativa en el desempeño global. De todos modos, el resultado para este método acompañó la tendencia a la mejora, ubicándose en el 2,74%, ligeramente por encima de la desviación estándar en la demora de ejecución. Nuevamente, el pobre desempeño de este método de predicción puede explicarse como consecuencia de las variaciones ocasionales de carga, las cuales no se ajustan al modelo lineal propuesto.
El modelo de predicción basado en el conjunto de redes neuronales univariadas demostró ser una alternativa a tener en cuenta, de acuerdo con los resultados de desempeño obtenidos. Si bien la mejora global de desempeño fue en este caso menor que para el ensayo preliminar (llegando en este caso al 30% de la mejora obtenida por el método perfecto, contra un 47% obtenido en el ensayo preliminar), la flexibilidad que brinda al sistema, permitiendo la modificación de la configuración de la máquina virtual debe ser considerada con especial atención. El uso de este algoritmo permite ampliar el conjunto de ET de la máquina virtual, debiendo entrenarse las redes correspondiente a la nueva ET únicamente.
El resultado obtenido para la aplicación distribuida alienta a continuar con el desarrollo del tema, profundizando en el tema de métodos de predicción que permitan modelar con exactitud las series temporales de datos de carga. De esta manera sería posible lograr una optimización de la mejora de desempeño, el cual pueda ser comparable con el método perfecto.
Si bien la mejora alcanzada parece no ser muy significativa, el resultado global obtenido alienta a continuar con el estudio de técnicas estadísticas tradicionales y no tradicionales para la predicción de datos futuros de carga. El resultado obtenido para el modelo PTIDAL utilizando el método de despacho basado en Redes Neuronales proporcionó una mejora del 6,25 por ciento en un ensayo con 5 CPUs. Este resultado puede implicar que el tiempo total de ejecución de una aplicación distribuida de 24 hs. de duración, sea reducido en una hora y media. También pudo verse que, en el caso ideal de conocer a la perfección la carga a futuro de la red, la mejora puede ser del orden del 14 por ciento. Cabe recordar que la mejora en desempeño depende del nivel de paralelismo utilizado, y para aplicaciones altamente paralelizables la reducción del tiempo de ejecución puede ser mayor.
Como resultado del desarrollo del sistema de despacho modificado, se cuenta con una interfase que permite incluir en forma sencilla nuevos algoritmos de predicción, para mejorar los resultados del despacho de tareas. El conjunto de programas de integración al sistema PVM fue desarrollado bajo el paradigma de diseño incremental. Este hecho posibilita la integración de nuevas técnicas de predicción que permitan implementar nuevos algoritmos de despacho.
Por su parte, el análisis de los datos históricos de carga permitió determinar correlaciones entre algunos equipos que forman la red de Facultad. Las correlaciones constituyen un factor relevante al momento de seleccionar equipos adecuados para la ejecución de aplicaciones distribuidas.
El programa de réplica de carga histórica fue ensayado separadamente, ofreciendo resultados de muy elevada precisión (del orden del 99% para la réplica de CPU) lo que constituye un producto destacable del proyecto. De esta manera se dispone de un ambiente para evaluar de manera justa nuevos algoritmos de despacho y determinar cuál es el más conveniente.
El resultado anterior permitió realizar la comparación
entre los diferentes algoritmos de despacho implementados en base a las
técnicas de predicción. Dichas técnicas ofrecieron
resultados satisfactorios para los propósitos del proyecto. El método
de despacho basado en la estrategia de predicción de Redes Neuronales
alcanzó el 50% de la supuesta mejora ideal de desempeño,
en ambos experimentos realizados.
En este aspecto debe señalarse que se utilizó como criterio de despacho elegir la ET cuya estimación de carga media a un horizonte de 5 minutos fuese mínima. Ese criterio puede mejorarse, y ensayarse otros bajo la hipótesis del método de predicción perfecto, ya que el ambiente de simulación desarrollado ahora lo permite. Este es un problema de optimización de difícil abordaje, que sería imposible de no contarse con el replicador elaborado en este proyecto. Así, sería posible encontrar el criterio de despacho óptimo dada una estimación de carga futura, y ensayarlo y validarlo en un sistema operando.
El nuevo algoritmo de despacho basado en la estrategia de predicción de Mínimos Cuadrados no ofreció buenos resultados. Este hecho motiva a plantear diferentes alternativas del método y realizar el estudio de técnicas más robustas de predicción.
Con respecto al método basado en Redes Neuronales, se abren muchas más posibilidades. La red denominada bp11 utiliza únicamente información del instante inmediatamente anterior al momento de despacho. Es factible que ello pueda mejorarse utilizando más información disponible, sin costo sensible al momento de predecir, pero en contrapartida con un costo significativo al momento de calcular los parámetros. El enfoque basado en Redes Neuronales admite con naturalidad la incorporación de otros parámetros (uso de disco, red, etc.) a la hora de predecir la carga de un equipo. En contrapartida, la fase de entrenamiento de la red es costosa, y la configuración de la máquina virtual debe ser decidida en forma estática en ese momento (por la vía de mencionar todos las ET involucradas). En nuestro trabajo se realizó el entrenamiento en ambiente Matlab, y sólo se programó en PVM el uso de la red una vez entrenada.
Dado que la red es entrenada una única vez, no se adapta a cambios en las características de uso de las máquina. En este respecto, es posible (aunque significativamente más complejo) utilizar Redes Adaptativas. Las mismas van aprendiendo de la historia a medida que ésta ocurre, y podrían, por ejemplo reaccionar ponderando con mayor peso información reciente de eventos transitorios (como una gran compilación en una máquina en la que ello no es típico), y de este modo asignarle menor prioridad a esa ET.
El análisis de un bloque de variables de carga ha sido propuesto
como una idea de trabajo futuro. En el transcurso del proyecto se decidió
trabajar exclusivamente con el consumo de CPU como parámetro relevante
para la determinación de la carga. Al considerar nuevas variables
es posible que aumente el factor de mejora de desempeño, bajo el
costo de técnicas más complejas de modelización.
Anexo I - Cronograma de actividades
Anexo II - Towards Proactive Network Load Management For Parallel
Distributed Programming
Anexo III - Artificial Replication of Network Load Environment for
Distributed Algorithms Comparison