Acelerando Maven mediante hilos paralelos

/ / Blog, Digital Development
Maven threads
Liberada la versión de Alfresco 5.0.d
Presentación de DARA-Documentos Medievales Aragoneses subportal creado con nubarchiva

Cuando utilizamos maven con proyectos muy grandes una simple limpieza de los directorios de trabajo puede ser un proceso largo que nos bloquea durante un tiempo. Ya existen numerosos tutoriales sobre cada uno de los pasos que se pueden optimizar para agilizar el proceso, por lo que este artículo solo hace referencia a la utilización de múltiples hilos de ejecución; opción disponible desde la versión 3 de maven.

 

Hilos de ejecución en Maven

Cuando lanzamos una tarea de maven, este revisa las dependencias del proyecto para organizar los módulos de acuerdo a las dependencias entre ellos y después lanza un hilo de ejecución que realiza la tarea en la cola de módulos preparada. La ejecución es lineal, si bien puede lanzar varios hilos para recuperar artefactos de los repositorios, pudiendo configurar el número de estos hilos mediante la propiedad:

-Dmaven.artifact.threads=6

Para que Maven utilice varios hilos de ejecución se usa el parámetro -T [número de hilos], pudiendo ser el número de hilos derivado del número de núcleos de la máquina con [numero de hilos por núcleo]C. Por ejemplo:

mvn -T 4 clean install # 4 hilos de ejecución
mvn -T 1C clean install # 1 hilo de ejecución por cada núcleo
mvn -T 1.5C clean install # 1.5 hilos de ejecución por cada núcleo

 

Pruebas

Para probar las diferencias de tiempo se ha utlizado un proyecto que consta de 76 módulos maven. La operación realizada es un ‘mvn clean install’ desde el raíz utilizando el siguiente script:

 

#!/bin/bash
function do_timing {
	echo Command: $1
	echo Command: $1>>timer.report
	(/usr/bin/time -f "Time: %E" $1 >> console.out)2>>timer.report
}
rm -rf console.out
rm -rf timer.report
do_timing "mvn clean install"
do_timing "mvn -T1 clean install"
do_timing "mvn -T2 clean install"
do_timing "mvn -T3 clean install"
do_timing "mvn -T4 clean install"
do_timing "mvn -T5 clean install"
do_timing "mvn -T6 clean install"
do_timing "mvn -T7 clean install"
do_timing "mvn -T8 clean install"
do_timing "mvn -T9 clean install"
do_timing "mvn -T10 clean install"
do_timing "mvn -T1C clean install"
do_timing "mvn -T2C clean install"
do_timing "mvn -T3C clean install"
do_timing "mvn -T4C clean install"
do_timing "mvn -T5C clean install"

 

Las especificaciones exáctas del equipo de pruebas no son especialmente relevantes, ya que se toma como referencia el tiempo inicial con un solo hilo. Solo cabe destacar que el disco duro del sistema es SSD y durante las ejecuciones la CPU del equipo trabaja al 100%, descartando cuellos de botella que falsearan las pruebas.

Los resultados obtenidos son:

 

Command: mvn clean install
Time: 0:41.05
Command: mvn -T1 clean install
Time: 0:41.90
Command: mvn -T2 clean install
Time: 0:33.23
Command: mvn -T3 clean install
Time: 0:32.64
Command: mvn -T4 clean install
Time: 0:35.57
Command: mvn -T5 clean install
Time: 0:32.68
Command: mvn -T6 clean install
Time: 0:31.02
Command: mvn -T7 clean install
Time: 0:32.40
Command: mvn -T8 clean install
Time: 0:35.29
Command: mvn -T9 clean install
Time: 0:34.33
Command: mvn -T10 clean install
Time: 0:37.34
Command: mvn -T1C clean install
Time: 0:35.41
Command: mvn -T2C clean install
Time: 0:34.92
Command: mvn -T3C clean install
Time: 0:36.94
Command: mvn -T4C clean install
Time: 0:38.17
Command: mvn -T5C clean install
Time: 0:37.88

Tiempos de ejecución dependiendo del número de hilos

Como podemos observar, a partir de 2 hilos se obtienen tiempos mejores que ya no disminuyen conforme aumentamos el número de hilos. Probablemente en estructuras de proyecto más complejas se obtendrán mejores resultados, aunque una mejora de un 20% no está nada mal.

 

Consideraciones

Si bien se obtiene una mejora considerable de los tiempos usando este parámetro hay que ser prudentes con su utilización porque no todos los plugins son ‘thread safe’ y no se asegura que se ejecuten correctamente. Una opción para tener este parámetro controlado es utilizar un alias que a su vez sea un alias del comando maven con el parámetro de hilos de ejecución, para poder usarlo solo en aquellos momentos que su ejecución es segura. Por ejemplo:

alias mvn-fast='alias mvn="mvn -T2 $1"'

que fijaría el uso de 2 hilos en las ejecuciones de esa sesión de la consola.

 


 

Referencias:

Configuring Maven – http://maven.apache.org/guides/mini/guide-configuring-maven.html
Parallel builds in Maven 3 – https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3