Extrae métricas de rendimiento de la compilación

Es probable que todos los usuarios de Bazel hayan experimentado compilaciones lentas o más lentas de lo previsto. Mejorar el rendimiento de las compilaciones individuales tiene un valor particular para los objetivos con un impacto significativo, como los siguientes:

  1. Objetivos principales de los desarrolladores que se iteran y se (re)compilan con frecuencia

  2. Bibliotecas comunes de las que dependen ampliamente otros objetivos

  3. Un objetivo representativo de una clase de objetivos (p. ej., reglas personalizadas). Diagnosticar y corregir problemas en una compilación puede ayudar a resolver problemas a mayor escala.

Un paso importante para mejorar el rendimiento de las compilaciones es comprender dónde se invierten los recursos. En esta página, se enumeran diferentes métricas que puedes recopilar. El desglose del rendimiento de la compilación muestra cómo puedes usar estas métricas para detectar y corregir problemas de rendimiento de la compilación.

Existen varias formas principales de extraer métricas de tus compilaciones de Bazel, como las siguientes:

Protocolo de eventos de compilación (BEP)

Bazel genera una variedad de búferes de protocolo build_event_stream.proto a través del Protocolo de eventos de compilación (BEP), que puede agregar un backend que especifiques. Según tus casos de uso, es posible que decidas agregar las métricas de varias maneras, pero aquí analizaremos algunos conceptos y campos de proto que serían útiles en general.

Comandos query, cquery y aquery de Bazel

Bazel proporciona 3 modos de consulta diferentes (query, cquery y aquery) que permiten a los usuarios consultar el gráfico de destino, el gráfico de destino configurado y el gráfico de acción respectivamente. El lenguaje de consulta proporciona un conjunto de funciones que se pueden usar en los diferentes modos de consulta, lo que te permite personalizar tus consultas según tus necesidades.

Perfiles de seguimiento de JSON

Para cada invocación de Bazel similar a una compilación, Bazel escribe un perfil de seguimiento en formato JSON. El perfil de seguimiento de JSON puede ser muy útil para comprender rápidamente en qué invirtió tiempo Bazel durante la invocación.

Registro de ejecución

El registro de ejecución puede ayudarte a solucionar problemas y corregir los aciertos de caché remota faltantes debido a diferencias de máquina y entorno o acciones no deterministas. Si pasas la marca --experimental_execution_log_spawn_metrics (disponible desde Bazel 5.2), también contendrá métricas de generación detalladas, tanto para acciones ejecutadas de forma local como remota. Puedes usar estas métricas, por ejemplo, para comparar el rendimiento de la máquina local y remota, o para averiguar qué parte de la ejecución de generación es constantemente más lenta de lo esperado (por ejemplo, debido a la cola).

Registro del gráfico de ejecución

Si bien el perfil de seguimiento de JSON contiene la información de la ruta crítica, a veces necesitas información adicional sobre el gráfico de dependencias de las acciones ejecutadas. A partir de Bazel 6.0, puedes pasar las marcas --experimental_execution_graph_log y --experimental_execution_graph_log_dep_type=all para escribir un registro sobre las acciones ejecutadas y sus interdependencias.

Esta información se puede usar para comprender el arrastre que agrega un nodo en la ruta crítica. El arrastre es la cantidad de tiempo que se puede ahorrar si se quita un nodo en particular del gráfico de ejecución.

Los datos te ayudan a predecir el impacto de los cambios en el gráfico de compilación y acción antes de que los realices.

Comparativas con bazel-bench

Bazel bench es una herramienta de comparativas para proyectos de Git que permite comparar el rendimiento de la compilación en los siguientes casos:

  • Comparativa de proyectos: Comparación de dos confirmaciones de Git entre sí en una sola versión de Bazel. Se usa para detectar regresiones en tu compilación (a menudo, a través de la adición de dependencias).

  • Comparativa de Bazel: Comparación de dos versiones de Bazel entre sí en una sola confirmación de Git. Se usa para detectar regresiones dentro de Bazel (si mantienes o bifurcas Bazel).

Las comparativas supervisan el tiempo de reloj, el tiempo de CPU y el tiempo del sistema, y el tamaño del montón retenido de Bazel.

También se recomienda ejecutar Bazel bench en máquinas físicas dedicadas que no ejecuten otros procesos para reducir las fuentes de variabilidad.