빌드 성능 측정항목 추출

문제 신고 소스 보기 1박 · 7.4 에서 자세한 내용을 확인하실 수 있습니다. 7.3 · 7.2 · 7.1 · 7.0 · 6.5

모든 Bazel 사용자는 예상보다 느리거나 더 느린 빌드를 경험해 보았을 것입니다. 개별 빌드의 성능을 개선하는 것은 다음과 같이 상당한 영향을 미치는 타겟에 특히 유용합니다.

  1. 자주 반복되고 (재)빌드되는 핵심 개발자 타겟

  2. 공통 라이브러리는 다른 타겟에 의해 널리 의존하고 있습니다.

  3. 타겟 클래스의 대표 타겟 (예: 맞춤 규칙), 한 빌드에서 문제를 진단하고 수정하는 것이 더 큰 규모입니다

빌드 성능을 개선하는 데 중요한 단계는 리소스가 어디에 사용되는지 파악하는 것입니다. 이 페이지에는 수집할 수 있는 다양한 측정항목이 나와 있습니다. 빌드 성능 분석 시연 빌드 성능 문제를 감지하고 해결하는 방법

Bazel 빌드에서 측정항목을 추출하는 몇 가지 주요 방법은 다음과 같습니다.

빌드 이벤트 프로토콜 (BEP)

Bazel은 빌드 이벤트 프로토콜(BEP)을 통해 다양한 프로토콜 버퍼 build_event_stream.proto를 출력하며, 이는 개발자가 지정한 백엔드에서 집계할 수 있습니다. 사용 사례에 따라 다양한 방식으로 측정항목을 집계할 수 있지만 여기서는 일반적으로 고려하는 데 유용한 몇 가지 개념과 proto 필드를 살펴봅니다.

Bazel의 query / cquery / aquery 명령어

Bazel은 3가지 쿼리 모드 (query, cqueryaquery)를 제공합니다. 대상 그래프 쿼리, 구성된 대상 그래프 및 작업 그래프 로 나뉩니다. 쿼리 언어는 다양한 플랫폼에서 사용할 수 있는 기능 모음 쿼리 모드를 사용하여 니즈에 따라 쿼리를 맞춤설정할 수 있습니다.

JSON 트레이스 프로필

Bazel은 모든 빌드와 같은 Bazel 호출에 대해 JSON 형식으로 트레이스 프로필을 작성합니다. JSON 트레이스 프로필은 Bazel이 호출 중에 시간을 소비한 항목을 빠르게 파악하는 데 매우 유용할 수 있습니다.

실행 로그

실행 로그를 사용하면 머신 및 환경 차이 또는 비결정론적 작업으로 인해 누락된 원격 캐시 히트를 해결할 수 있습니다. 이 플래그를 --experimental_execution_log_spawn_metrics (Bazel 5.2에서 사용 가능) 여기에는 작업을 수행할 수 있습니다 예를 들어 이러한 측정항목을 사용하여 로컬 및 원격 머신 성능을 비교하거나 생성 작업의 어떤 부분이 예상보다 지속적으로 느리게 실행되는지 사용할 수 없습니다.

실행 그래프 로그

JSON 트레이스 프로필에는 중요한 경로 정보가 포함되어 있지만 실행된 작업의 종속 항목 그래프에 관한 추가 정보가 필요한 경우도 있습니다. Bazel 6.0부터는 --experimental_execution_graph_log--experimental_execution_graph_log_dep_type=all 플래그를 전달하여 실행된 작업과 상호 종속 항목에 관한 로그를 작성할 수 있습니다.

이 정보를 사용하여 중요 경로의 노드에서 추가된 드래그를 파악할 수 있습니다. 드래그는 지연 시간을 줄일 수 있는 이를 위해 실행 그래프에서 특정 노드를 제거합니다.

데이터를 통해 빌드 및 작업 그래프에 대한 변경사항의 영향을 예측할 수 있음 할 수 있습니다.

bazel-bench를 사용한 벤치마킹

Bazel 벤치는 빌드 성능을 벤치마킹할 수 있는 Git 프로젝트용 벤치마킹 도구입니다. 다음과 같습니다.

  • 프로젝트 벤치마크: 한 번에 두 개의 git 커밋을 벤치마킹합니다. 단일 Bazel 버전 빌드에서 회귀를 감지하는 데 사용됩니다 (일반적으로 종속 항목 추가).

  • Bazel 벤치마크: 단일 git 커밋에서 두 버전의 Bazel을 서로 벤치마킹합니다. Bazel 자체 내에서 회귀를 감지하는 데 사용됩니다( Bazel을 유지 / 포크할 수 있습니다.)

벤치마크는 실제 시간, CPU 시간, 시스템 시간, Bazel의 유지된 힙 크기를 모니터링합니다.

또한 개별 가상 머신이 아닌 다른 프로세스를 실행하지 않고 가변성의 원인을 줄입니다.