Extrae métricas de rendimiento de la compilación

Informar un problema Ver fuente

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

  1. Principales objetivos del desarrollador que se iteran y se vuelven a compilar con frecuencia

  2. Bibliotecas comunes que dependen en gran medida de otros destinos.

  3. Un objetivo representativo de una clase de objetivos (p.ej., reglas personalizadas), el diagnóstico y la corrección de 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 gastan los recursos. En esta página, se enumeran las diferentes métricas que puedes recopilar. En Desglosar el rendimiento de la compilación, se muestra cómo puedes usar estas métricas para detectar y solucionar problemas de rendimiento de la compilación.

Existen varias formas principales de extraer métricas de tus compilaciones de Bazel, incluidas 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 se pueden agregar mediante un backend que especifiques. Según tus casos de uso, puedes decidir agregar las métricas de varias maneras, pero aquí revisaremos algunos conceptos y campos proto que serían útiles en general para tener en cuenta.

Comandos query / cquery / aquery de Bazel

Bazel proporciona 3 modos de consulta diferentes (consulta, 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 JSON

Para cada invocación de Bazel similar a la compilación, Bazel escribe un perfil de seguimiento en formato JSON. El perfil de registro de JSON puede ser muy útil para comprender con rapidez a qué dedicó Bazel tiempo durante la invocación.

Registro de ejecución

El registro de ejecución puede ayudarte a solucionar y corregir aciertos de caché remota faltantes debido a diferencias entre máquinas y entornos o 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 que se ejecutan 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 averiguar qué parte de la ejecución de la generación es coherentemente más lenta de lo esperado (por ejemplo, debido a las colas).

Registro del grafo de ejecución

Si bien el perfil de registro de JSON contiene la información de la ruta de acceso crítica, a veces necesitas información adicional sobre 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 potencialmente 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 de acción antes de realizarlos.

Comparativas con bazel-bench

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

  • Comparativas del proyecto: Comparativas 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 mediante la adición de dependencias).

  • Comparativas de Bazel: 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 los tiempos, de CPU y del sistema, así como del tamaño del montón retenido de Bazel.

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