Extrae métricas de rendimiento de la compilación

Informa un problema Ver código fuente

Es probable que todos los usuarios de Bazel hayan tenido 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 se reconstruyen con frecuencia.

  2. Bibliotecas en las que se suelen basar otros destinos.

  3. Un objetivo representativo de una clase de objetivos (p.ej., reglas personalizadas) para 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 dónde 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 solucionar problemas de rendimiento de compilación.

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

Protocolo de evento de compilación (BEP)

Bazel genera una variedad de búferes de protocolo build_event_stream.proto a través del protocolo de evento de compilación (BEP), que puede agregarse mediante un backend especificado por ti. Según tus casos prácticos, puedes decidir agregar las métricas de varias maneras, pero aquí revisaremos algunos conceptos y campos proto que serán útiles en general para considerar.

Comandos de consulta / cquery / baquery de Bazel

Bazel proporciona 3 modos de consulta diferentes (query, cquery y aquery) que permiten a los usuarios consultar el grafo de destino, el de destino y el de acción configurados. 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 JSON

Por cada invocación similar a una compilación de Bazel, Bazel escribe un perfil de seguimiento en formato JSON. El perfil de seguimiento JSON puede ser muy útil para comprender con rapidez el tiempo que Bazel pasó en la invocación.

Registro de ejecución

El registro de ejecución puede ayudarte a solucionar problemas y solucionar aciertos de caché remota faltantes debido a las diferencias de máquina y entorno, 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 ejecutadas de forma local y remota. Puedes usar estas métricas, por ejemplo, para realizar comparaciones entre el rendimiento de la máquina local y la remota, o a fin de descubrir qué parte de la ejecución de generación es 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 JSON contiene la información de la ruta de acceso crítica, a veces necesitas información adicional en el grafo 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 de acceso crítica. El arrastre es la cantidad de tiempo que se puede guardar con la eliminación de un nodo en particular del grafo de ejecución.

Los datos te ayudan a predecir el impacto de los cambios en el grafo de acción y compilación antes de realizarlos en realidad.

Comparativas con Bazel-Bench

Bazel banco es una herramienta de comparativas para proyectos de Git a fin de comparar el rendimiento de las compilaciones en los siguientes casos:

  • Comparativas del proyecto: Ofrece comparativas de 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: Compara dos versiones de Bazel entre sí en una confirmación de Git. Se usa para detectar regresiones en Bazel (si realizas el mantenimiento o la bifurcación de Bazel).

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

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