Como extrair métricas de desempenho do build

Informar um problema Ver código-fonte

Provavelmente, todos os usuários do Bazel já viram builds lentos ou mais lentos do que o esperado. Melhorar o desempenho de builds individuais tem um valor específico para destinos com impacto significativo, como:

  1. Principais metas do desenvolvedor que são iteradas e reconstruídas com frequência.

  2. Bibliotecas comuns dependem amplamente de 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 maior escala.

Uma etapa importante para melhorar a performance dos builds é entender onde os recursos são gastos. Esta página lista diferentes métricas que você pode coletar. Detalhamento do 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 das versões do Bazel:

Build Event Protocol (BEP)

O Bazel gera vários buffers de protocolo build_event_stream.proto com o Build Event Protocol (BEP), que pode ser agregado por um back-end especificado por você. Dependendo dos seus casos de uso, é possível agregar as métricas de várias maneiras, mas vamos analisar alguns conceitos e campos proto que podem ser úteis no geral.

Comandos de consulta / cquery / aquery do Bazel

O Bazel oferece três modos de consulta (query, cquery e aquery) que permitem consultar os gráficos de destino e de ação configurados, respectivamente. A linguagem de consulta oferece um pacote de funções utilizável em diferentes modos de consulta que permite personalizar as consultas de acordo com suas necessidades.

Perfis de rastreamento JSON

Para cada invocação do Bazel semelhante a uma versão, ele grava um perfil de trace no formato JSON. O perfil de trace JSON pode ser muito útil para entender rapidamente em que o Bazel passou tempo durante a invocação.

Registro de execução

O registro de execução pode ajudar você a solucionar problemas e corrigir falhas no cache remoto devido a diferenças de máquina e ambiente ou ações não determinísticas. Se você transmitir a sinalização --experimental_execution_log_spawn_metrics (disponível no Bazel 5.2), ela também conterá métricas detalhadas para ações executadas local e remotamente. É possível usar essas métricas para, por exemplo, fazer comparações entre 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 à fila).

Registro do gráfico de execução

O perfil de trace do JSON contém as informações essenciais do caminho, mas, à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 sinalizações --experimental_execution_graph_log e --experimental_execution_graph_log_dep_type=all para gravar um registro sobre as ações executadas e suas interdependências.

Essas informações podem ser usadas para entender a ação de arrastar adicionada por um nó no caminho crítico. A ação de arrastar é o tempo que pode ser salvo 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 você realmente fazer isso.

Comparativo de mercado com bazel-bench

O Bazel bench é uma ferramenta de comparação para projetos Git que avaliam o desempenho do build nos seguintes casos:

  • Comparativo de projeto:comparar duas confirmações git entre si em uma única versão do Bazel. Usado para detectar regressões no build (geralmente pela adição de dependências).

  • Comparativo do Bazel: compara duas versões do Bazel uma com a outra em uma única confirmação do git. Usado para detectar regressões no próprio Bazel (se você realizar a manutenção / bifurcar o Bazel).

Os comparativos de mercado monitoram o tempo decorrido, o tempo de CPU e o horário do sistema, além do tamanho da pilha retida do Bazel.

Além disso, é recomendado executar o banco do Bazel em máquinas físicas e dedicadas que não estejam executando outros processos para reduzir as fontes de variabilidade.