Provavelmente, todos os usuários do Bazel já tiveram builds lentos ou mais lentos do que o esperado. Melhorar a performance de builds individuais é especialmente importante para destinos com impacto significativo, como:
Metas principais de desenvolvedores que são frequentemente repetidas e (re)construídas.
Bibliotecas comuns amplamente usadas por outros destinos.
Um destino representativo de uma classe de destinos (por exemplo, regras personalizadas). Diagnosticar e corrigir problemas em um build pode ajudar a resolver problemas em uma escala maior.
Uma etapa importante para melhorar a performance dos builds é entender onde os recursos são gastos. Esta página lista diferentes métricas que podem ser coletadas. Como detalhar o desempenho do build mostra como usar essas métricas para detectar e corrigir problemas de desempenho do build.
Há algumas maneiras principais de extrair métricas dos seus builds do Bazel:
Build Event Protocol (BEP)
O Bazel gera vários buffers de protocolo
build_event_stream.proto
pelo Build Event Protocol (BEP), que
pode ser agregado por um back-end especificado por você. Dependendo dos seus casos de uso, você pode agregar as métricas de várias maneiras, mas aqui vamos abordar alguns conceitos e campos de proto que seriam úteis em geral.
Comandos query / cquery / aquery do Bazel
O Bazel oferece três modos de consulta diferentes (query, cquery e aquery) que permitem aos usuários consultar o gráfico de destino, o gráfico de destino configurado e o gráfico de ação, respectivamente. A linguagem de consulta oferece um conjunto de funções que podem ser usadas nos diferentes modos de consulta e permitem personalizar as consultas de acordo com suas necessidades.
Perfis de rastreamento JSON
Para cada invocação do Bazel semelhante a um build, o Bazel grava um perfil de rastreamento no formato JSON. O perfil de rastreamento JSON pode ser muito útil para entender rapidamente em que o Bazel gastou tempo durante a invocação.
Registro de execução
O registro de execução pode ajudar você a resolver e corrigir
ausências de hits de cache remoto devido a diferenças de máquina e ambiente ou
ações não deterministas. Se você transmitir a flag
--experimental_execution_log_spawn_metrics
(disponível no Bazel 5.2), ela também vai conter métricas detalhadas de geração, tanto para
ações executadas localmente quanto remotamente. Você pode usar essas métricas, por exemplo, para comparar o desempenho de máquinas locais e remotas ou descobrir qual parte da execução de geração é consistentemente mais lenta do que o esperado (por exemplo, devido ao enfileiramento).
Registro do gráfico de execução
Embora o perfil de rastreamento JSON contenha as informações do caminho crítico, às vezes
você precisa de mais informações sobre o gráfico de dependência das ações executadas.
A partir do Bazel 6.0, é possível transmitir as flags
--experimental_execution_graph_log
e
--experimental_execution_graph_log_dep_type=all
para gravar um registro sobre as
ações executadas e as interdependências delas.
Essas informações podem ser usadas para entender o arrasto adicionado por um nó no caminho crítico. O arrasto é a quantidade de tempo que pode ser economizada ao remover um nó específico do gráfico de execução.
Os dados ajudam a prever o impacto das mudanças no gráfico de build e ação antes de fazê-las.
Comparativo de mercado com o bazel-bench
O Bazel bench é uma ferramenta de comparativo de mercado para projetos do Git que avalia a performance de build nos seguintes casos:
Comparativo de mercado do projeto:compara dois commits do Git em uma única versão do Bazel. Usado para detectar regressões no build (geralmente com a adição de dependências).
Comparativo de mercado do Bazel:comparativo de mercado de duas versões do Bazel em um único commit do git. Usado para detectar regressões no próprio Bazel (se você mantiver / fizer fork do Bazel).
Os comparativos monitoram o tempo real, o tempo de CPU e o tempo do sistema, além do tamanho do heap retido do Bazel.
Também é recomendável executar o Bazel bench em máquinas físicas dedicadas que não estejam executando outros processos para reduzir as fontes de variabilidade.