En esta página, se describe cómo optimizar el rendimiento de compilación de Bazel cuando se ejecuta Bazel repetidamente.
Estado del entorno de ejecución de Bazel
Una invocación de Bazel implica varias partes que interactúan.
La interfaz de línea de comandos (CLI)
bazel
es la herramienta de frontend orientada al usuario y recibe comandos del usuario.La herramienta de la CLI inicia un servidor de Bazel. para cada base de salida distinta. El servidor de Bazel suele ser persistente, pero se apagará cuando haya estado inactivo. tiempo para no desperdiciar recursos.
El servidor de Bazel realiza los pasos de carga y análisis para un comando determinado. (
build
,run
,cquery
, etc.), donde construye las partes necesarias del gráfico de compilación en la memoria. Las estructuras de datos resultantes se retienen en el servidor de Bazel como parte de la caché de análisis.El servidor de Bazel también puede ejecutar la acción o puede enviar acciones desactivadas para la ejecución remota si está configurada para hacerlo. Los resultados de las ejecuciones de acciones también se almacenan en caché, en particular, en la caché de acciones (o caché de ejecución, que puede ser local o remota, y es posible que se comparta entre los servidores de Bazel).
El resultado de la invocación de Bazel está disponible en el árbol de resultados.
Ejecuta Bazel de forma iterativa
En un flujo de trabajo típico de un desarrollador, es común compilar (o ejecutar) un fragmento de código
repetidamente, a menudo con una frecuencia muy alta (p.ej., para resolver alguna compilación
o investigar una prueba fallida). En esta situación, es importante
Las invocaciones repetidas de bazel
tienen la menor sobrecarga posible en relación con
la acción subyacente y repetida (p. ej., invocar un compilador o ejecutar una prueba)
Con esto en mente, volvemos a analizar el estado del entorno de ejecución de Bazel:
La caché de análisis es un dato fundamental. Una cantidad significativa de tiempo puede puede dedicarse solo a las fases de carga y análisis de una ejecución en frío (es decir, una ejecución después de iniciar el servidor de Bazel o cuando se descartó la caché de análisis). En el caso de una compilación en frío que se realiza correctamente (p.ej., para una versión de producción), este costo es de tolerable, pero para crear repetidamente el mismo objetivo, es importante que el costo se amortice y no se repita en cada invocación.
La caché de análisis es bastante volátil. Primero, es parte del proceso
estado del servidor de Bazel, por lo que perder el servidor pierde la caché. Pero la caché
también se invalida con mucha facilidad: por ejemplo, muchas marcas de línea de comandos bazel
hacen que se descarte la caché. Esto se debe a que muchas marcas afectan la compilación
gráfico (p.ej., debido a
atributos configurables). Algo de marca
los cambios también pueden hacer que se reinicie el servidor de Bazel (p.ej., cambiar
opciones de inicio).
Una buena caché de ejecución también es valiosa para el rendimiento de la compilación. Una ejecución la caché se puede conservar de forma local en el disco de forma remota. La caché se puede compartir servidores de Bazel y, por cierto, entre los desarrolladores.
Evita descartar la caché de análisis
Bazel imprimirá una advertencia si se descartó la caché de análisis o si se reinició el servidor. Se debe evitar cualquiera de los siguientes casos durante el uso iterativo:
Ten cuidado de cambiar las marcas
bazel
en medio de una iteración en el flujo de trabajo. Por ejemplo, si combinas unbazel build -c opt
con unbazel cquery
hace que cada comando descarte la caché de análisis del otro. En general, intenta usar un conjunto fijo de marcas durante un flujo de trabajo específico.Si se pierde el servidor de Bazel, se pierde la caché de análisis. El servidor de Bazel tiene un inactivo configurable tiempo y después se apagará. Puedes configurar esta hora mediante tu bazelrc para adaptarlo a tus necesidades. El servidor también se reinició durante el inicio las marcas cambian, por lo que, de nuevo, evita cambiarlas si es posible.
Ten cuidado de que el servidor de Bazel se cierra si presionas Presiona Ctrl + C varias veces mientras se ejecuta Bazel. Es tentador intentar ahorrar tiempo interrumpiendo una compilación en ejecución que ya no es necesaria, pero solo presiona Presiona Ctrl + C una vez para solicitar un final correcto de la invocación actual.
Si deseas usar varios conjuntos de marcas del mismo lugar de trabajo, puedes usar múltiples bases de salida distintas, cambiadas con el
--output_base
marca. Cada base de salida recibe su propio servidor de Bazel.