调试远程缓存命中以在本地执行

报告问题 查看源代码 每夜 build · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

本页介绍了如何在本地执行环境中调查缓存未命中问题。

本页面假设您有一个在本地成功构建且已设置为使用远程缓存的 build 和/或测试,并且您希望确保远程缓存得到有效利用。

如需了解如何检查缓存命中率以及如何比较两个 Bazel 调用之间的执行日志,请参阅调试远程执行的远程缓存命中。该指南中介绍的所有内容也适用于本地执行的远程缓存。不过,本地执行会带来一些额外的挑战。

查看缓存命中率

成功的远程缓存命中将显示在状态行中,类似于启用远程执行时的缓存命中率

在 Bazel 运行的标准输出中,您会看到如下所示的内容:

   INFO: 7 processes: 3 remote cache hit, 4 linux-sandbox.

这意味着,在尝试执行的 7 项操作中,有 3 项操作命中了远程缓存,4 项操作未命中缓存,并使用 linux-sandbox 策略在本地执行。此摘要不包含本地缓存命中。如果您得到的进程数为 0(或低于预期),请依次运行 bazel clean 和 build/test 命令。

缓存命中问题排查

如果您未获得预期的缓存命中率,请执行以下操作:

确保与远程端点成功通信

为确保您的 build 能够成功与远程缓存通信,请按照本部分中的步骤操作。

  1. 检查输出是否存在警告

    在远程执行模式下,如果无法与远程端点通信,构建将会失败。另一方面,如果可缓存的本地 build 无法缓存,也不会失败。检查 Bazel 调用的输出,看是否存在警告,例如:

       WARNING: Error reading from the remote cache:
    

       WARNING: Error writing to the remote cache:
    

    此类警告后面会跟随详细说明连接问题的错误消息,这些消息应该有助于您进行调试:例如,端点名称输错或凭据设置不正确。查找并解决所有此类错误。如果您看到的错误消息中的信息不足,请尝试添加 --verbose_failures

  2. 请按照排查远程执行缓存命中问题中的步骤操作,确保写入缓存的 Bazel 调用能够在同一台机器和多台机器上获得缓存命中。

  3. 确保缓存读取型 Bazel 调用可以获得缓存命中。

    a. 由于缓存读取型 Bazel 调用将具有不同的命令行设置,因此请特别注意,确保它们已正确设置为与远程缓存通信。确保已设置 --remote_cache 标志,并且输出中没有警告。

    b. 确保用于读取缓存的 Bazel 调用构建的目标与用于写入缓存的 Bazel 调用构建的目标相同。

    c. 请按照确保跨机器缓存中的步骤操作,确保从缓存写入 Bazel 调用到缓存读取 Bazel 调用进行缓存。