Bajar el tiempo de build all en una KB GeneXus

Desde hace un par de días, estamos trabajando con Nicolás, para lograr bajar el tiempo de build all de una KB.

Baseline. 

Partimos de una KB que tiene 1557 objetos main. (muchos reportes y web services).

Tomamos como ejemplo a mejorar, el caso en que la KB no tenga ningún objeto modificado, ni tenga nada para compilar, pues ese caso nos permite ver donde estamos haciendo tareas que realmente no agregan valor al proceso.  En este caso (que no había nada para compilar) todo el proceso demora unos 65 minutos.

El proceso hace:

* Actualiza la KB desde GXServer
* Especifica y Genera los fuentes
* Compila todo los main.

Todas estas tareas están automatizadas con tareas MSBuild y Jenkins.

Estudiando los tiempos que llevan estas etapas, vimos que tenían un tiempo en promedio, en caso de no tener nada para actualizar ni generar:

* Arranque y seteos iniciales (2 minutos)
* Actualización desde el server (5 minutos)
* Especificación y Generación (8 minutos)
* Compilación de main (50 minutos).

Por los números vimos que lo mas critico para esta KB y donde nos conviene concentrar los esfuerzos era en la etapa de compilación.

Las tareas de especificación y generación ya se pueden paralelizar en GeneXus, haciendo que corran varios procesos en paralelo, con lo cual se bajan mucho los tiempos de esa etapa.

Paralelizando la Compilación. 

Hoy estábamos utilizando 2 pasos, uno para hacer el update desde GXServer y otro para  hacer la especificación, generación y compilación en otro paso. 



Pasamos la propiedad de CompileMains a false, con lo que se hace una compilación del developer menu y de los SDT, y recursos compartidos , que son necesarios para poder compilar luego los demás programas. 

También desarrollamos un versión del compilado que dispara varias compilaciones en paralelo. 
Como esta programado, puede pasar que algunos archivos se bloqueen pues quieran grabar algun archivo , por lo que si un proceso falla, reintenta con los mismos valores. 




Por ahora es solo una prueba de concepto (nunca mejor dijcho!) para ver que todo funcione bien y no tengamos grandes lios.

Lo que hace es recorrer todos los bld*.cs del directorio y con eso somete la compilacion en paralelo, pues se llama a la tarea MSBUILD con el parámetro maxcpucount de la forma:


Add caption
Solo funciona con .NET y para aplicaciones WEB pero estamos en la etapa de generalizarlo para cualquier KB Genexus (en java, .NET y con SD)

Evaluación

Con esto logramos bajar de 50 minutos a 16 minutos (un tercio !) la compilación bajando bastante los tiempos de build. En los casos que tiene que recompilar todo, el porcentaje de mejora es todovia mejor

Me pareció interesante compartirlo por si alguien quiere hacer algo parecido.


Comentarios

  1. Excelente Enrique, hace muchos años trabajé en la geberacgen y compilación en paralelo con GeneXus, una cosa que te recomiendo es si estas haciendo esto en una misma máquina, redefinas para cada corrida el tempfile, en su época parte de los problemas estaba en la colisión en los archivos generados de forma temporal. Si vas a ir por la parte de Java, en mi blog publique que usaba yo para acelerar la compilación de Java. Puede que estas cosas que te recomiendo aún no sigan vigentes con las nuevas versiones de genexus. Pero si siguen sucediendo en una de esas te pueden servir para acelerar. Lo otro es el tipo de cpu CPU y el tipo de IO que GeneXus genera, en disco, si tienes SSD te puede servir bastante. En su época lo que hice fue montar el directorio temporal en ram para tener aún mejor performance. Cuanto más cores reales mejor, deshabilitando hyperthreading incluso mejoraba aún más. Exitos con esas pruebas. Seguramente se pueda seguir optimizando, de todas formas tremenda bajada de tiempo lograste.

    ResponderEliminar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Paleta de colores en GeneXus

Sistema LUCIA: 20 años de una KB en producción.