빌드 성능 측정항목 추출

문제 신고 소스 보기

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

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

  2. 공통 라이브러리는 다른 타겟의 영향을 많이 받습니다.

  3. 대상 클래스 (예: 맞춤 규칙)의 대표 대상은 하나의 빌드에서 문제를 진단하고 해결하여 대규모 문제를 해결하는 데 도움이 될 수 있습니다.

빌드 성능을 개선하는 중요한 단계는 리소스 지출 위치를 파악하는 것입니다. 이 페이지에는 수집할 수 있는 다양한 측정항목이 나열되어 있습니다. 빌드 성능 분석에서는 이러한 측정항목을 사용하여 빌드 성능 문제를 감지하고 해결하는 방법을 보여줍니다.

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

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

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

Bazel의 쿼리 / cquery / aquery 명령어

Bazel은 사용자가 각각 타겟 그래프와 구성된 그래프 및 작업 그래프를 쿼리할 수 있는 3가지 쿼리 모드 (query, cquery, aquery)를 제공합니다. 쿼리 언어는 다양한 쿼리 모드에서 사용할 수 있는 함수 모음을 제공하므로 필요에 따라 쿼리를 맞춤설정할 수 있습니다.

JSON 트레이스 프로필

빌드와 유사한 Bazel 호출마다 Bazel은 트레이스 프로필을 JSON 형식으로 작성합니다. JSON 트레이스 프로필은 Bazel이 호출 중에 시간을 보낸 내용을 빠르게 이해하는 데 매우 유용할 수 있습니다.

실행 로그

실행 로그를 사용하면 머신 및 환경 차이 또는 비확정적 작업으로 인한 누락된 원격 캐시 적중 문제를 해결하는 데 도움이 됩니다. Bazel 5.2에서 사용할 수 있는 플래그 --experimental_execution_log_spawn_metrics를 전달하면 로컬 및 원격으로 실행되는 작업의 세부 생성 측정항목도 포함됩니다. 예를 들어 이러한 측정항목을 사용하여 로컬과 원격 머신 성능을 비교하거나, 생성 실행의 어떤 부분이 예상보다 지속적으로 느린지 (예: 큐로 인해) 확인할 수 있습니다.

실행 그래프 로그

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

이 정보를 사용하여 중요 경로의 노드에서 추가한 드래그를 이해할 수 있습니다. 드래그는 실행 그래프에서 특정 노드를 삭제하여 잠재적으로 저장할 수 있는 시간입니다.

이 데이터를 통해 빌드 및 작업 그래프를 실제로 변경하기 전에 변경사항의 영향을 예측할 수 있습니다.

bazel-bench를 사용한 벤치마킹

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

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

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

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

또한 가변성의 원인을 줄이기 위해 다른 프로세스를 실행하지 않는 전용 물리적 머신에서 Bazel 벤치를 실행하는 것이 좋습니다.