Maven: Parallel builds benchmark

El uso de Maven para la gestión y construcción de los proyectos Java es, con el permiso de Graddle, prácticamente un estándar. Ahora bien, su capacidad para realizar construcciones en paralelo y la mejora de rendimiento que esto aporta puede que no sean tan conocidas.

En el presente artículo se pretende analizar cómo influye el uso de las construcciones en paralelo con diferentes configures sobre un proyecto multimodulo Java, con el objetivo determinar si su uso es o no beneficioso.

Caso de uso

Se dispone de proyecto Java construido con Maven con el siguiente árbol de dependencias.

Parallel builds

Maven 3.x dispone de una funcionalidad experimental que permite realizar construcciones en paralelo en función del número de hilos especificados.

mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core

Para ello, Maven analiza el grafo de dependencias del proyecto y paraleliza la construcción de aquellos módulos que así lo permitan, pudiendo obtener, según la documentación oficial, una mejora de rendimiento entre el 20-50%.

Para el caso de uso presentado y en función del número de hilos disponibles, se podría llegar a paralizar la construcción del primer y tercer módulo del segundo nivel, con los del tercero.

Benchmark

Batería de pruebas

Se han realizado 100 construcciones (mvn package) del proyecto con 1, 2, 4, 8 y 16 hilos, habiendo descargado previamente las librerías de terceros, con el objetivo de no introducir en los resultados problemas derivados de la red.

Por supuesto, antes de cada ejecución se ha realizado una limpieza del workspace (mvn clean) para garantizar la homogeneidad de las pruebas.

Se ha configurado también el maven-surefire-report-plugin para ejecutar los teses unitarios en paralelo, concretamente, cada clase se ejecutara en un hilo independiente.

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-report-plugin</artifactId>
	<version>${maven-surefire-plugin.version}</version>
	<configuration>
		<parallel>classes</parallel>
	</configuration>
</plugin>

Finalmente para la medición de los tiempo se ha hecho de uso del plugin maven-profiler, el cual almacena en un fichero json el tiempo de ejecución de cada fase del ciclo de vida de Maven.

Entorno de ejecución

Las pruebas se han realizado sobre una instancia EC2 de Amazon, concretamente sobre una t2.xlarge, la cual cuenta con 4 cores de hasta 3GHz y 16GB de RAM.

Como sistema operativo se ha empleado un Red Hat Enterprise Linux 7.6 y la versión de Maven utilizada ha sido la 3.5.2 junto a OpenJDK 1.8.0-201 x64.

Resultados

Este es el tiempo total de ejecución para cada una de las configuraciones.

Como se puede observar, el tiempo baja considerablemente al pasar de uno a varios hilos, con una mejora cercana al 20%. Eso sí, la ganancia no es lineal y el hecho de añadir más hilos no es siempre beneficioso, como se puede observar en el salto de 8 a 16 hilos.

En lo que al tiempo medio de cada ejecución se refiere, los números muestran reafirman lo comentado anteriormente, logrando una mejora en todos los apartados.

Es interesante observar también la estabilidad de las ejecuciones bajo configuraciones multihilo, algo que sin duda aporta tranquilidad de cara a su uso.

Conclusiones

En conclusión, realizar construcciones en paralelo puede ser muy beneficioso dependiendo de la tipología del proyecto y del hardware empleado, por lo que es conveniente dedicar tiempo a analizar cada caso.

Ahora bien, antes de lanzarse al vació es recomendable leer con atención la documentación de Maven, ya que no todos los plugins y librerías son Thread safe y pueden acarrear errores.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s