아마 모든 Bazel 사용자는 빌드가 느리거나 예상보다 느린 경험을 했을 것입니다. 개별 빌드의 성능을 개선하는 것은 다음과 같이 상당한 영향을 미치는 타겟에 특히 유용합니다.
자주 반복되고 (다시) 빌드되는 핵심 개발자 타겟
다른 타겟에서 널리 사용되는 일반적인 라이브러리
타겟 클래스 (예: 커스텀 규칙)의 대표 타겟, 한 빌드에서 문제를 진단하고 해결하면 더 큰 규모의 문제를 해결하는 데 도움이 될 수 있습니다.
빌드의 성능을 개선하는 중요한 단계는 리소스가 사용되는 위치를 파악하는 것입니다. 이 페이지에는 수집할 수 있는 다양한 측정항목이 나와 있습니다. 빌드 성능 분석에서는 이러한 측정항목을 사용하여 빌드 성능 문제를 감지하고 해결하는 방법을 보여줍니다.
Bazel 빌드에서 측정항목을 추출하는 방법에는 다음과 같은 몇 가지 주요 방법이 있습니다.
빌드 이벤트 프로토콜 (BEP)
Bazel은 다양한 프로토콜 버퍼
build_event_stream.proto
를 빌드 이벤트 프로토콜 (BEP)을 통해 출력하며, 이는
사용자가 지정한 백엔드에서 집계할 수 있습니다. 사용 사례에 따라
다양한 방법으로 측정항목을 집계할 수 있지만 여기서는 일반적으로 고려하는 데 유용한 몇 가지 개념과 프로토 필드를
살펴보겠습니다.
Bazel의 query / cquery / aquery 명령어
Bazel은 사용자가 각각 타겟 그래프, 구성된 타겟 그래프, 작업 그래프를 쿼리할 수 있는 3가지 쿼리 모드 (query, cquery 및 aquery)를 제공합니다. 쿼리 언어는 다양한 쿼리 모드에서 사용할 수 있는 함수 모음을 제공하므로 필요에 따라 쿼리를 맞춤설정할 수 있습니다.
JSON trace 프로필
빌드와 같은 Bazel 호출마다 Bazel은 JSON 형식으로 trace 프로필을 작성합니다. JSON trace 프로필은 호출 중에 Bazel이 시간을 보낸 작업을 빠르게 파악하는 데 매우 유용할 수 있습니다.
실행 로그
실행 로그는 머신 및 환경 차이 또는
비결정적 작업으로 인해 누락된 원격 캐시 적중을 해결하고 수정하는 데 도움이 될 수 있습니다. Bazel 5.2부터 사용할 수 있는
--experimental_execution_log_spawn_metrics
플래그를 전달하면
로컬 및 원격으로 실행된 작업 모두에 대한 세부 스폰 측정항목도 포함됩니다. 예를 들어 이러한 측정항목을 사용하여
로컬 및 원격 머신 성능을 비교하거나
스폰 실행의 어느 부분이 예상보다 지속적으로 느린지 (예:
대기열로 인해) 확인할 수 있습니다.
실행 그래프 로그
JSON trace 프로필에는 중요 경로 정보가 포함되어 있지만 실행된 작업의 종속 항목 그래프에 관한 추가 정보가 필요한 경우도 있습니다.
Bazel 6.0부터 플래그
--experimental_execution_graph_log 및
--experimental_execution_graph_log_dep_type=all를 전달하여
실행된 작업 및 상호 종속 항목에 관한 로그를 작성할 수 있습니다.
이 정보는 중요 경로의 노드에서 추가되는 드래그를 파악하는 데 사용할 수 있습니다. 드래그는 실행 그래프에서 특정 노드를 삭제하여 잠재적으로 절약할 수 있는 시간입니다.
이 데이터는 실제로 변경하기 전에 빌드 및 작업 그래프 변경의 영향을 예측하는 데 도움이 됩니다.
bazel-bench로 벤치마킹
Bazel bench는 다음과 같은 경우에 빌드 성능을 벤치마킹하는 Git 프로젝트용 벤치마킹 도구입니다.
프로젝트 벤치마크: 단일 Bazel 버전에서 두 Git 커밋을 서로 벤치마킹합니다. 빌드에서 회귀를 감지하는 데 사용됩니다 (종속 항목 추가를 통해).
Bazel 벤치마크: 단일 Git 커밋에서 두 Bazel 버전을 서로 벤치마킹합니다. Bazel 자체 내에서 회귀를 감지하는 데 사용됩니다 (Bazel을 유지관리 / 포크하는 경우).
벤치마크는 실제 시간, CPU 시간, 시스템 시간, Bazel의 보관된 힙 크기를 모니터링합니다.
변동성 소스를 줄이기 위해 다른 프로세스를 실행하지 않는 전용 물리적 머신에서 Bazel bench를 실행하는 것이 좋습니다.