Generalidades

Mejora del rendimiento de la canalización: asignación de memoria de procesos y DAG | Por Antonio S. | Números de Loblaw | Marzo de 2022

Mejora del rendimiento de la canalizacion asignacion de memoria de

Recientemente, uno de nuestros equipos de Android estaba actualizando algunas de sus bibliotecas y otros trabajos de mantenimiento. Cuando hicieron algunas confirmaciones, su aplicación comenzó a hacer preguntas sobre su canalización.

1648229147 379 Mejora del rendimiento de la canalizacion asignacion de memoria de
Errores de CI/CD de Gitlab

Nuestro Gitlab CI/CD está configurado para expirar después de una hora de trabajo. Este tiempo de espera se produce durante una fase de compilación con varias tareas. El problema ocurre con la tarea ensamblarDebugAndroidTest; esta tarea es responsable de ensamblar una versión de prueba de depuración del proyecto.

Mejora del rendimiento de la canalizacion asignacion de memoria de
fotógrafo Katrinhoff existe sin salpicaduras

Cuando comenzó el mantenimiento de la biblioteca, investigué la canalización de nuestra aplicación y encontré algo interesante. Sin el almacenamiento en caché, el tiempo total de canalización alcanzó 1 hora y 10 minutos; esto fue suficiente para recibir tiempos de espera. Cuando volví a ejecutar la compilación, algunas tareas ya estaban almacenadas en caché, por lo que se ejecutó durante unos 48 minutos.Lo primero que pensé fue que una de las tareas se quedó atascada en algún lugar. cuna El proceso tenía algunos problemas de memoria, así que decidí depurarlo.

Vale la pena mencionar que en mi máquina local se compila rápidamente sin ningún problema. Todo apunta a un problema con la configuración de la canalización y la máquina de compilación de CI.

¿Cómo depuramos el proceso de Gradle?

Dado que Gradle proporciona una buena configuración de registro y opciones de formato, decidí combinar advertir nivel de registro Rico Formato. Un registro de advertencia significa que sus mensajes de advertencia se mostrarán en la consola, y el formato enriquecido coloreará y cambiará las variantes de fuente en la salida. Se configura usando una de las siguientes opciones:

En tu gradle.properties Agregue las siguientes líneas:

1648229147 609 Mejora del rendimiento de la canalizacion asignacion de memoria de

O establezca las siguientes variables de entorno de Gradle:

1648229148 721 Mejora del rendimiento de la canalizacion asignacion de memoria de

o simplemente ejecuta:

1648229148 421 Mejora del rendimiento de la canalizacion asignacion de memoria de

Tenga en cuenta que puede escribir sus propios registros en archivos Gradle.

También se pueden usar seguimientos de pila habilitados para Gradle – rastro de pila[-s] o – seguimiento de pila completa[-S]Puede ejecutar un comando similar como este:

1648229148 141 Mejora del rendimiento de la canalizacion asignacion de memoria de

Usando la configuración de registro y las opciones de formato anteriores, pude encontrar el problema:

java.lang.OutOfMemoryError

La primera pregunta que me viene a la cabeza es:

Si hemos seguido las mejores prácticas para compilar, reducir el tamaño de apk y estamos usando una estrategia de almacenamiento en caché para la canalización, ¿por qué tenemos problemas de memoria?

El proyecto en sí es enorme, pero no se suma para justificar que la construcción se vuelva cada vez más lenta. Así que decidí comparar nuestro proceso y degradar algunas de las bibliotecas que actualizamos anteriormente.Encontré nuestro Complemento Kotlin Gradle versión más lenta 1.6.10 y 1.6.0 Comparar 1.5.32una persona abrió uno pregunta Tiempos de compilación incrementales para versiones 1.6.0 Esto aparentemente se resolvió en la versión hace unos meses. 1.6.10Así que ese es mi punto de partida.

Cómo funcionan las compilaciones de Gradle:

1648229148 633 Mejora del rendimiento de la canalizacion asignacion de memoria de
Proceso de compilación de Gradle desde Android Studio
  1. envoltura gradle (graduación) descargue y pase sus argumentos a la versión gradle que ha incluido en su proyecto.
  2. Luego, graduación Tus tareas serán evaluadas y pasadas al demonio gradle.
  3. Demonio Gradle es un proceso en segundo plano de larga duración para tareas pesadas que aprovecha el almacenamiento en caché y evita el costoso procesamiento de arranque.
  4. compilador Kotlin (Kotlink) entonces se llama.

Los procesos de Gradle y Kotlinc se ejecutan en sus propias instancias de JVM. Entonces, durante este proceso, las asignaciones de memoria van automáticamente a Gradle, y no sabe cuántas de ellas se establecerán en kotlinc.

Después de mirar las etiquetas dentro de nosotros gradle.properties Noté que hemos asignado memoria explícitamente para gradle pero no para kotlinc. Dado que se ejecutan en diferentes procesos, también debemos asignar memoria explícitamente para kotlinc.

Para solucionar esto, he agregado las siguientes etiquetas:

1648229148 255 Mejora del rendimiento de la canalizacion asignacion de memoria de

Esto asigna 2 GB dedicados al compilador kotlin. Dependiendo de la cantidad de memoria libre que tenga, se pueden agregar más. Para nosotros, 2GB es suficiente. ¡No solo se solucionan nuestros problemas, sino que nuestras canalizaciones son más rápidas que nunca!

Ya tenemos mucha tubería y configuración de Android centrada en el rendimiento, pero siempre hay espacio para mejorar.Si está interesado en mejorar el rendimiento de la compilación, puede obtener más información aquí, aquí y aquí.

Mientras hablamos de esto…

otra mejora

Gitlab recomienda fallar rápido para detectar errores temprano. Gitlab CI/CD proporciona una solución llamada Gráfico acíclico dirigido (DAG), podemos construir relaciones entre trabajos sabiamente en nuestras canalizaciones. Podemos ejecutar ciertos trabajos sin esperar a que terminen los trabajos anteriores.Por ejemplo, puede ejecutar hilas trabajar al mismo tiempo compilar/probar Trabajo.Aquí solo estamos arañando la superficie, pero hemos ahorrado 7 minutos Simplemente use el DAG en nuestra canalización.

La productividad no es solo una herramienta

Dado que la productividad no se trata solo de herramientas, debemos tener una visión holística del ciclo de vida del desarrollo de software (SDLC) que involucra procesos y personas. En otras palabras, necesitamos identificar cuellos de botella en el proceso de desarrollo, prueba, revisión de código, reelaboración, implementación, etc.

Tenemos que basarnos en datos, así que veamos nuestro impacto en el siguiente ejemplo:

Digamos que somos un equipo de 10 desarrolladores y elijo una canalización Fases de compilación, lint, prueba e implementación para analizar.

Antes de la reparación:

  • El tiempo total de canalización sin almacenamiento en caché fue de entre 55 minutos y 1 hora y 10 minutos.
  • Las canalizaciones que utilizan la caché oscilan entre 35 y 48 minutos.
  • La fase de compilación comienza a expirar y la canalización falla durante 5 días después de ejecutarse durante 1 hora.

espalda:

  • El tiempo de ejecución general de la canalización sin almacenamiento en caché fue de entre 39 y 53 minutos.
  • El rango de tiempo para usar el caché es de 21 minutos a 40 minutos.
  • Ahorre al menos 20 minutos de correcciones de fase de compilación por desarrollador por ejecución.
  • El DAG ha ahorrado hasta 7 minutos por ejecución hasta ahora.

resultado:

En el mejor de los casos, la ejecución sin la memoria caché ahorra hasta un 29 % del tiempo de canalización, y con la memoria caché se ahorra hasta un 40 %. Si ejecutamos 10 canalizaciones al día, ahorraríamos más de 3 horas esperando que se ejecute la etapa de compilación para descubrir que se agotaría el tiempo de espera. Además, el método DAG ahorra 1 hora por día.

Solo debemos tener en cuenta que el tiempo variará según la cantidad de tareas que Gradle pueda almacenar en caché para la compilación específica de cada desarrollador. A veces puedo ejecutar la fase de compilación en menos de 7 minutos.

Optimizar el proceso de compilación puede reducir el tiempo de ciclo del desarrollo del equipo. Acabamos de comenzar a usar DAG para Gitlab CI/CD. Esperamos mejorar nuestra tubería. Solo para darle algunas ideas, puede trabajar en el rendimiento de compilación, revisiones de código, procesos de corrección de errores, reducción del tamaño de APK y diferentes áreas para aumentar la felicidad de su equipo. Este es nuestro objetivo como equipo de ingeniería de productividad y lanzamiento.

LEER  Google promete solucionar el problema de la pantalla parpadeante de Pixel 6 Pro

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba