Como extrair métricas de desempenho do build

Reportar um problema Ver a fonte Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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:

  1. Metas principais de desenvolvedores que são frequentemente repetidas e (re)construídas.

  2. Bibliotecas comuns amplamente usadas por outros destinos.

  3. 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.