Provavelmente, todos os usuários do Bazel tiveram builds lentos ou lentos em comparação com é previsto. Melhorar o desempenho de builds individuais tem um valor particular para metas com impacto significativo, como:
Principais destinos de desenvolvedores que são frequentemente iterados e (re)criados.
Bibliotecas comuns amplamente dependentes de outros alvos.
Uma segmentação representativa de uma classe de segmentações (por exemplo, regras personalizadas) o diagnóstico e a correção de problemas em um build podem ajudar a resolver em maior escala.
Uma etapa importante para melhorar o desempenho dos builds é entender onde recursos são gastos. Esta página lista as diferentes métricas que você pode coletar. Detalhamento do desempenho do build como usar essas métricas para detectar e corrigir problemas de desempenho do build.
Há algumas maneiras principais de extrair métricas dos builds do Bazel:
Protocolo de evento de build (BEP)
O Bazel gera vários buffers de protocolo
build_event_stream.proto
usando o Build Event Protocol (BEP), que
podem ser agregadas por um back-end especificado por você. Dependendo dos casos de uso,
você pode decidir agregar as métricas de várias maneiras, mas aqui vamos
alguns conceitos e campos proto que seriam úteis de forma 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 para consultar o gráfico de destino, o gráfico de destino configurado e o gráfico de ações respectivamente. A linguagem de consulta fornece pacote de funções utilizáveis em diferentes modos de consulta, o que permite personalizar as consultas de acordo com suas necessidades.
Perfis de trace JSON
Para cada invocação do Bazel semelhante a uma versão, o Bazel grava um perfil de rastreamento em JSON. . O perfil de trace JSON pode muito útil para entender rapidamente em que o Bazel passou o tempo durante a invocação.
Registro de execução
O registro de execução pode ajudar você a solucionar problemas e corrigir
ausência de ocorrências em cache remoto devido a diferenças de máquina e ambiente ou
ações não deterministas. Se você passar a sinalização
--experimental_execution_log_spawn_metrics
(disponível no Bazel 5.2), ele também contém métricas detalhadas de geração, tanto para
ações executadas local e remotamente. Você pode usar essas métricas, por exemplo, para
comparar o desempenho de máquinas locais e remotas ou para descobrir
qual parte da execução da geração é consistentemente mais lenta do que o esperado (por
exemplo devido à fila).
Registro do gráfico de execução
Embora o perfil de trace JSON contenha as informações do caminho crítico, às vezes
você precisa de mais informações sobre o gráfico de dependências 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 o
as ações executadas e as interdependências deles.
Essas informações podem ser usadas para entender a ação de arrastar que é adicionada por um nó caminho crítico. A ação de arrastar é o tempo que pode ser economizado removendo um nó específico do gráfico de execução.
Os dados ajudam a prever o impacto das mudanças no gráfico de ação e build antes de realizá-las.
Comparação com o bazel-bench
O Bazel bench é ferramenta de comparativo de mercado para projetos Git para comparar o desempenho do build no seguintes casos:
Comparativo de mercado do projeto: comparação entre duas confirmações do git em uma uma única versão do Bazel. Usado para detectar regressões no seu build (geralmente por a adição de dependências).
Comparativo de mercado do Bazel:comparação entre duas versões do Bazel um único commit do git. Usado para detectar regressões no próprio Bazel (se você por manter / bifurcar o Bazel).
Os comparativos de mercado monitoram o tempo decorrido, o tempo de CPU e o tempo do sistema, além dos tempos do Bazel retidos tamanho de heap.
Também é recomendável executar o banco de dados do Bazel em máquinas físicas dedicadas que não executam outros processos para reduzir as fontes de variabilidade.