원격 실행을 위한 원격 캐시 적중 디버깅

문제 신고 <ph type="x-smartling-placeholder"></ph> 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

이 페이지에서는 캐시 적중률을 확인하는 방법과 조사 방법을 설명합니다. 캐시 부적중을 방지합니다.

이 페이지에서는 성공적으로 작동하는 빌드 또는 테스트가 있다고 가정합니다. 원격 실행을 활용하며, 원격 실행을 효과적으로 활용하여 원격 캐시를 활용합니다.

캐시 적중률 확인

Bazel 실행의 표준 출력에서 다음을 나열하는 INFO 줄을 확인합니다. 프로세스로, 대략 Bazel 작업과 일치합니다. 행 세부정보 확인할 수 있습니다 작업을 나타내는 remote 라벨을 찾습니다. 원격으로 실행되며 로컬 샌드박스에서 실행된 작업의 경우 linux-sandbox입니다. 기타 실행 전략에 관한 기타 값을 사용할 수 있습니다. 결과가 나타난 작업 remote cache hit로 표시됩니다.

예를 들면 다음과 같습니다.

INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.

이 예에서 원격 캐시 적중이 6회 있었고, 작업 2건에는 캐시되지 않았습니다. 캐시 적중을 확인하고 원격으로 실행되었습니다. 내부의 3개 부분은 무시해도 됩니다. 일반적으로 심볼릭 링크 생성과 같은 작은 내부 작업입니다. 지역 캐시 적중은 이 요약에 포함되지 않습니다. 프로세스가 0개인 경우 (또는 예상보다 낮은 수) bazel clean를 실행한 후 빌드/테스트를 실행합니다. 명령어와 함께 사용하면 됩니다

캐시 적중 문제 해결

캐시 적중률이 예상대로 나타나지 않으면 다음을 수행합니다.

동일한 빌드/테스트 명령어를 재실행하면 캐시 적중이 발생하는지 확인

  1. 캐시를 채울 것으로 예상되는 빌드 또는 테스트를 실행합니다. 이 새 빌드가 특정 스택에서 처음 실행될 때는 캐시 적중. 원격 실행의 일부로 작업 결과가 캐시하고 후속 실행에서 이를 선택해야 합니다.

  2. bazel clean을 실행합니다. 이 명령은 로컬 캐시를 정리하여 공격자가 결과를 마스킹하지 않고 원격 캐시 적중을 조사하여 로컬 캐시 적중

  3. 다시 조사 중인 빌드와 테스트를 동일한 있습니다.

  4. INFO 줄에서 캐시 적중률을 확인합니다. 다음을 제외한 프로세스가 표시되지 않는 경우 remote cache hitinternal이면 캐시가 올바르게 채워지고 액세스할 수 있습니다 이 경우 다음 섹션으로 건너뜁니다.

  5. 빌드에서 밀폐되지 않은 것이 불일치의 원인일 수 있습니다. 작업을 전달하여 두 번의 실행에서 서로 다른 작업 키를 받습니다. 찾기 다음과 같이 하세요.

    a. 문제의 빌드 또는 테스트를 다시 실행하여 실행 로그를 얻습니다.

      bazel clean
      bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
    

    b. 실행 로그 비교: 두 번 실행합니다 두 로그 파일에서 작업이 동일한지 확인합니다. 불일치를 통해 2045년과 2004년 사이에 일어난 실행할 수도 있습니다 빌드를 업데이트하여 이러한 불일치를 제거하세요.

    캐싱 문제를 해결할 수 있고 이제 반복 실행이 생성하므로 다음 섹션으로 건너뜁니다.

    액션 ID는 동일하지만 캐시 적중이 없다면 구성 때문에 캐싱이 차단되고 있습니다. 이 섹션을 계속 진행하여 다음을 수행합니다. 일반적인 문제를 확인합니다

  6. 실행 로그의 모든 작업에 cacheable가 true로 설정되어 있는지 확인합니다. 만약 cacheable가 주어진 작업의 실행 로그에 나타나지 않는 경우 은 해당 규칙에 no-cache 태그가 있을 수 있음을 의미합니다. 정의 BUILD 파일에 있습니다. mnemonictarget_label을 확인합니다. 필드가 실행되어 작업이 진행되는 위치를 확인할 수 있습니다. 있습니다.

  7. 작업이 동일하고 cacheable이지만 캐시 적중이 없으면 명령줄에 다음과 같은 --noremote_accept_cached가 포함되어 있을 수 있습니다. 빌드에 대한 캐시 조회를 사용 중지합니다.

    실제 명령줄을 파악하는 것이 어렵다면 표준 명령줄에서 이벤트 프로토콜 빌드 방법은 다음과 같습니다.

    a. 텍스트의 로그 버전을 얻으려면 Bazel 명령어에 --build_event_text_file=/tmp/bep.txt를 추가하세요.

    b. 로그의 텍스트 버전을 열고 command_line_label: "canonical"님과의 메시지 structured_command_line개 펼치면 모든 옵션이 나열됩니다.

    c. remote_accept_cached를 검색하고 false로 설정되어 있는지 확인합니다.

    d. remote_accept_cachedfalse이면 현재 위치를 확인합니다. false로 설정: 명령줄 또는 bazelrc 파일을 다운로드합니다.

머신 간 캐싱 보장

동일한 시스템에서 캐시 적중이 예상대로 발생하면 다른 머신에서 동일한 빌드/테스트를 실행할 수 없습니다. 캐싱이 의심되는 경우 발생하는 문제를 해결하려면 다음 단계를 따르세요.

  1. 기존 캐시에 도달하지 않도록 빌드를 약간 수정합니다.

  2. 첫 번째 머신에서 빌드를 실행합니다.

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. 두 번째 머신에서 빌드를 실행하여 1단계의 수정을 확인합니다. 포함:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. 두 항목의 실행 로그 비교 실행할 수도 있습니다 로그가 동일하지 않으면 빌드 구성을 조사합니다. 불일치 및 호스트 환경 유출로 인한 속성 실행할 수 있습니다

실행 로그 비교

실행 로그에는 빌드 중에 실행된 모든 작업 레코드가 포함됩니다. 대상 각 액션에 대해 SpawnExec 요소가 포함됩니다. 따라서 로그가 동일하고 작업 캐시 키도 같습니다.

캐시 적중을 예상대로 공유하지 않는 두 빌드의 로그를 비교하려면 다음을 수행하세요.

  1. 각 빌드에서 실행 로그를 가져와서 /tmp/exec1.log로 저장합니다. /tmp/exec2.log입니다.

  2. Bazel 소스 코드를 다운로드하고 아래 명령어를 사용하여 Bazel 폴더로 이동합니다. 소스 코드는 실행 로그와 함께 execlog 파서

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. 실행 로그 파서를 사용하여 로그를 텍스트로 변환합니다. 다음 호출은 작업 순서와 일치하도록 두 번째 로그의 작업도 정렬합니다. 첫 번째 로그에 포함시키세요.

    bazel build src/tools/execlog:parser
    bazel-bin/src/tools/execlog/parser \
      --log_path=/tmp/exec1.log \
      --log_path=/tmp/exec2.log \
      --output_path=/tmp/exec1.log.txt \
      --output_path=/tmp/exec2.log.txt
    
  4. /tmp/exec1.log.txt/tmp/exec2.log.txt입니다.