Es probable que todos los usuarios de Bazel hayan experimentado compilaciones que fueron lentas o más lentas de lo previsto. Mejorar el rendimiento de compilaciones individuales tiene un valor particular para los objetivos con un impacto significativo, como los siguientes:
Objetivos principales para desarrolladores que se iteran y (re)construyen con frecuencia.
Bibliotecas comunes de las que dependen otros destinos.
Un objetivo representativo de una clase de objetivos (p.ej., reglas personalizadas) que diagnostique y corrija 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 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 formato JSON. El perfil de seguimiento JSON puede ser muy útil para comprender rápidamente en qué se dedicó tiempo Bazel durante la invocación.
Registro de ejecución
El registro de ejecución puede ayudarte a solucionar problemas y corregir
los hits de caché remotos que faltan debido a diferencias entre máquinas y entornos o
acciones no deterministas. Si pasas la marca
--experimental_execution_log_spawn_metrics
(disponible a partir de Bazel 5.2), también contendrá métricas de creación detalladas, tanto para
acciones ejecutadas de forma local como 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 la demora que agrega un nodo en la ruta crítica. La demora es la cantidad de tiempo que se puede ahorrar quitando 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 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 de proyectos: Realiza 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, 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 dentro de Bazel (si mantienes o bifurcas Bazel).
Las comparativas supervisan el tiempo de ejecución, el tiempo de la CPU y el tiempo del sistema, y el tamaño del montón retenido de Bazel.
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.