Extrae métricas de rendimiento de la compilación

Informar un problema Ver código fuente Nocturno · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Probablemente, todos los usuarios de Bazel experimentaron compilaciones lentas o más lentas de lo previsto. Mejorar el rendimiento de las compilaciones individuales tiene un valor particular para los destinos con un impacto significativo, como los siguientes:

  1. Objetivos principales para los desarrolladores que se iteran y se (re)construyen con frecuencia

  2. Son bibliotecas comunes de las que dependen ampliamente otros destinos.

  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 utilizan los recursos. En esta página, se enumeran las diferentes métricas que puedes recopilar. En Análisis del rendimiento de la compilación, se muestra cómo puedes usar estas métricas para detectar y corregir problemas de rendimiento de la compilación.

Existen algunas formas principales de extraer métricas de tus compilaciones de Bazel, a saber:

Build Event Protocol (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 especificado por ti. Según tus casos de uso, es posible que decidas agregar las métricas de varias maneras, pero aquí analizaremos algunos conceptos y campos proto que serían útiles en general para tener en cuenta.

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 y que te permiten personalizar tus consultas según tus necesidades.

Perfiles de registro en formato 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 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 y corregir la falta de aciertos en la caché remota debido a diferencias en la máquina y el entorno, o bien a acciones no determinísticas. Si pasas la marca --experimental_execution_log_spawn_metrics (disponible a partir de Bazel 5.2), también contendrá métricas detalladas de spawn, tanto para las acciones ejecutadas de forma local como remota. Puedes usar estas métricas, por ejemplo, para comparar el rendimiento de las máquinas locales y remotas, o bien para averiguar qué parte de la ejecución de la generación es constantemente más lenta de lo esperado (por ejemplo, debido a la puesta en cola).

Registro del gráfico de ejecución

Si bien el perfil de seguimiento en formato 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 la demora que agrega un nodo en la ruta crítica. La resistencia 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 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 del proyecto: Comparativa 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: Comparativa de dos versiones de Bazel 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 pared, el tiempo de CPU y el tiempo del sistema, así como el tamaño del heap 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.