martes, 8 de diciembre de 2009

Compilación GeneXus 9.0/Java: problemas de performance

En una KB GeneXus 9.0 grande (en nuestro caso unos 8.100 objetos), ubicada en la red y de uso compartido, la compilación puede tener algunos serios problemas de performance.

Existen dos formas de compilar, y las dos presentan dificultades:
  • usando NMake, la compilación es rápida, pero demora mucho cuando tiene que generar algún .mak porque cambió el árbol de llamadas
  • usando GXJMake, la generación es rápida, pero la compilación nos demoraba en algunos casos más de 2 minutos.
En particular el GXJMake, tiene un algoritmo que dista mucho de ser óptimo. Enrique estuvo analizando por que demoraba tanto, y llegó a que lo que hace es recorrer todo el árbol de llamadas (lo lee de los archivos .ari) y por cada objeto, compara la fecha del .java con la del .class. El tema es que lo hace una vez por cada aparición del objeto en el árbol.

En el caso que analizamos, había un objeto que estaba comparando las fechas más de 1.400 veces... ¡Y ni siquiera era el objeto que había modificado!

Una demora de 2 minutos como teníamos, para compilar un solo objeto modificado baja muchísimo la productividad, no solo por la demora en sí de la compilación, sino también porque la persona que tiene que esperar esos dos minutos casi seguro que se distrae y se pone a hacer alguna otra cosa.

Este problema es conocido, y está reportado en al menos dos SACs:
La solución, fue desarrollar nuestro propio programa de Make: COJMake.

Este programa ejecuta en el servidor donde está ubicada la KB, y queda monitoreando si hay algún .java modificado. Cuando detecta un .java modificado, lo manda a compilar(1). El programa graba un log que permite monitorear lo que está haciendo y detectar si se produjo algún error en la compilación.

Con esto, el programa ni siquiera necesita que se termine de generar para poder empezar a compilar. Si se están generando varios objetos, a medida que se va terminando de generar uno ya queda listo para compilar.

El efecto es que ahora la compilación es prácticamente instantanea. En condiciones normales (cuando se manda a generar unos pocos objetos), cuando se termina de generar demora menos de dos segundos en terminar de compilar.

(1) En realidad lo que hace es ir guardando los archivos modificados en una cola, y hay otro hilo que va compilando lo que aparece en la cola. Esto permite limitar el número de procesos que se largan a compilar, sin perder ningún archivo en el medio.

4 comentarios:

  1. Hay alguna idea de publicar esto para beneficio de la comunidad ??

    ResponderEliminar
  2. Hola, yo hice tambien mi propio jmake. Se llama magicmake y hasta detecta que queria pedir realmente el usuario, desarrolla el codigo y hasta publica automaticamente todo. Lamentablemente yo tampoco puedo compartirlo a la comunidad, pero es bueno que sepan que existe. Saludos

    ResponderEliminar
  3. Y me podés dar una idea de como hacer un propio Xmake?

    ResponderEliminar
  4. Marcos, consulta, tienes algun ejemplo del configuration.xml que nos puedas facilitar?

    ResponderEliminar