本页面介绍如何在本地执行环境中调查缓存未命中。
本页面假定您的构建和/或测试在本地成功构建,并且已设置为使用远程缓存,并且您希望确保远程缓存得到有效利用。
如需了解如何查看缓存命中率以及如何比较两个 Bazel 调用的执行日志,请参阅调试远程执行中的远程缓存命中。该指南中介绍的所有内容也适用于具有本地执行的远程缓存。不过,本地执行带来了一些额外挑战。
检查缓存命中率
成功的远程缓存命中会显示在状态行中,类似于 Remote Execution 的缓存命中率。
在 Bazel 运行的标准输出中,您会看到如下内容:
INFO: 7 processes: 3 remote cache hit, 4 linux-sandbox.
这意味着有 7 次操作尝试,其中 3 次发生了远程缓存命中,4 次操作没有缓存命中,而是使用 linux-sandbox
策略在本地执行。此摘要中不包含本地缓存命中。如果您收到 0 个进程(或低于预期的数字),请运行 bazel clean
,后跟您的构建/测试命令。
排查缓存命中问题
如果您没有获得预期的缓存命中率,请执行以下操作:
确保与远程端点成功通信
为确保您的构建成功与远程缓存通信,请按照本部分中的步骤操作。
检查您的输出中是否有警告
使用远程执行时,未能与远程端点通信会导致构建失败。另一方面,如果可缓存的本地构建无法缓存,则不会失败。检查 Bazel 调用的输出是否有警告,例如:
WARNING: Error reading from the remote cache:
或
WARNING: Error writing to the remote cache:
此类警告后面会显示错误消息,详细说明连接问题(例如输入的端点名称或输入的凭据不正确)。找出并修正任何此类错误。如果您看到的错误消息无法为您提供足够的信息,请尝试添加
--verbose_failures
。按照排查远程执行的缓存命中中的步骤操作,确保您的缓存写入 Bazel 调用能够在同一台计算机和不同的机器上获取缓存命中。
确保您的缓存读取 Bazel 调用可以获取缓存命中。
a. 由于缓存读取 Bazel 调用将设置不同的命令行,因此应格外小心,确保调用设置正确,才能与远程缓存通信。确保已设置
--remote_cache
标志,且输出中没有警告。b. 确保缓存读取 Bazel 调用构建的目标与缓存写入的 Bazel 调用构建相同的目标。
c.按照与确保跨机器缓存相同的步骤操作,确保从写入缓存的 Bazel 调用缓存到缓存读取的 Bazel 调用。