對遠端執行作業進行遠端快取命中偵錯

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

本頁說明如何查看快取命中率及調查方式 執行遠端執行時,發生快取失敗的情況。

本頁假設您已順利建構和/或測試 必須能從遠端執行作業,並想確保自己有效率 利用遠端快取

檢查快取命中率

在 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. 比較執行記錄 兩次呼叫確保兩個記錄檔之間的動作都相同。 「差異」能讓您瞭解 或任何可執行 Knative 的環境中請更新您的版本,消除這些差異。

    如果您能解決快取問題,而且現在重複執行 產生的所有快取命中,請跳至下一個部分。

    如果您的動作 ID 相同,但沒有快取命中, 設定中禁止快取。繼續本節,即可: 檢查是否有常見問題

    如果執行記錄檔不需要差異比較,您可以使用 建議改用人類可讀的 --execution_log_json_file 旗標。不得為 用於穩定差異,因為它包含執行時間 保證能訂購。

  6. 確認執行記錄中的所有動作都將 cacheable 設為 true。如果 cacheable 不會顯示在授權動作的執行記錄中, 代表相對應的規則可能在包含 no-cache 標記 BUILD 檔案中的定義。查看人類可讀的 progress_message 欄位來協助判定動作來源。

  7. 如果動作相同且 cacheable,但沒有快取命中, 您的指令列可能包含 --noremote_accept_cached 會停用建構的快取查詢功能。

    如果很難確定實際的命令列,請使用 從指令列啟動 建立事件協定 如下所示:

    a. 將 --build_event_text_file=/tmp/bep.txt 新增至 Bazel 指令, 文字版記錄檔

    b. 開啟文字版記錄,然後搜尋 structured_command_line 則含有「command_line_label: "canonical"」的訊息。 展開後的所有選項都會列出。

    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. 比較兩者的執行記錄檔 或任何可執行 Knative 的環境中如果記錄不相同,請調查您的建構設定 造成其差異以及主機環境外洩 其中一個版本

比較執行記錄檔

執行記錄包含建構期間執行的所有動作的記錄。適用對象 每個動作都有 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