Extrae métricas de rendimiento de la compilación

Informar un problema Ver fuente Noche /}1}

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

  1. Objetivos principales del desarrollador que se iteran y (re)compilan con frecuencia.

  2. Bibliotecas comunes de las que dependen ampliamente otros objetivos

  3. Un destino representativo de una clase de objetivos (p.ej., reglas personalizadas), diagnosticar y solucionar 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 en qué se gastan los recursos. En esta página, se enumeran las diferentes métricas que puedes recopilar. En Cómo desglosar el rendimiento de la compilación, se muestra cómo puedes usar estas métricas para detectar y corregir problemas de rendimiento de 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 agregarse mediante un backend que especifiques. Según tus casos de uso, es posible que decidas agregar las métricas de varias maneras, pero aquí repasaremos algunos conceptos y campos proto que serían útiles de tener en cuenta en general.

Comandos de Bazel para consultas, cquery y aquery

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 las 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 con rapidez en qué estuvo Bazel durante la invocación.

Registro de ejecución

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

Registro del grafo de ejecución

Si bien el perfil de seguimiento JSON contiene la información de la ruta crítica, a veces necesitas información adicional en el gráfico de dependencia 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 la compilación y en el gráfico de acciones 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 compilación en los siguientes casos:

  • Comparativas del proyecto: Compara dos confirmaciones de Git entre sí en una sola versión de Bazel. Se usa para detectar regresiones en la compilación (a menudo, mediante la adición de dependencias).

  • Comparativas de Bazel: Son comparativas de dos versiones de Bazel entre sí en una sola confirmación de Git. Se usa para detectar regresiones dentro de Bazel (si tienes que mantener / bifurcar Bazel).

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

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