Es probable que todos los usuarios de Bazel hayan experimentado compilaciones lentas o más lentas que lo previsto. Mejorar el rendimiento de compilaciones individuales tiene un valor particular para los objetivos con un impacto significativo, como los siguientes:
Objetivos principales del desarrollador que se iteran y (re)compilan con frecuencia.
Bibliotecas comunes de las que dependen otros destinos.
Un objetivo representativo de una clase de objetivos (p.ej., reglas personalizadas) diagnosticar y solucionar problemas en una compilación puede ayudar a resolverlos a mayor escala.
Un paso importante para mejorar el rendimiento de las compilaciones es comprender dónde se gastan todos 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 la compilación.
Existen algunas formas principales de extraer métricas de tus compilaciones de Bazel, a saber:
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 ser agregado por un backend que especifiques. Según tus casos de uso, puedes decidir 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 puede usar en los diferentes modos de consulta, lo que te permite personalizar tus consultas según tus necesidades.
Perfiles de seguimiento JSON
Para cada invocación de Bazel similar a una compilación, Bazel escribe un perfil de seguimiento en JSON. de un conjunto de datos tengan un formato común. El perfil de seguimiento de JSON puede sería muy útil para comprender rápidamente a qué dedicaba Bazel durante el invocación.
Registro de ejecución
El registro de ejecución puede ayudarte a solucionar problemas y corregir errores.
aciertos de caché remota faltantes debido a diferencias de máquina y entorno, o
y no deterministas. Si pasas la bandera
--experimental_execution_log_spawn_metrics
(disponible a partir de Bazel 5.2) también contendrá métricas de generación detalladas,
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 remota, o para averiguar qué parte de la ejecución de creación es más lenta de lo esperado de forma constante (por ejemplo, debido a la creación de filas).
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 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 quitando un nodo específico del grafo de ejecución.
Los datos te ayudan a predecir el impacto de los cambios en la compilación y el gráfico de acciones antes de realizarlos.
Cómo realizar comparativas con bazel-bench
Bazel bench es una herramienta de comparativas para proyectos de Git que compara el rendimiento de la compilación en los siguientes casos:
Comparativas del proyecto: Compara dos confirmaciones de Git entre sí en un versión única de Bazel. Se usan para detectar regresiones en tu compilación (a menudo, a través de la adición de dependencias).
Comparativas de Bazel: Comparación de dos versiones de Bazel entre sí en una sola confirmación de git. Se usa para detectar regresiones en el mismo Bazel (si mantener / bifurcar Bazel).
Las comparativas supervisan el tiempo de pared, el tiempo de CPU y el tiempo del sistema, así como la retención el tamaño del montón de memoria.
También se recomienda ejecutar la comparativa de Bazel en máquinas físicas dedicadas que no ejecuten otros procesos para reducir las fuentes de variabilidad.