跳到主要内容

BE 多目录共享缓存

在与 AI Agent 协作进行 Doris BE 开发时,一种常见的模式是利用 git worktree 等方式同时在不同目录下维护多个开发分支,并行开发。由于 ccache 缓存对全路径名敏感,因此在不同的目录中,即使绝大多数 cpp 文件内容相同,ccache 也无法命中缓存,导致 worktree 目录必须从零开始编译,极大拖慢开发速度。为解决这一问题,我们进行了定制的优化,按以下方式配置即可。

1. 目录要求

Doris 已经在环境配置文件中设定了 CCACHE_BASEDIR-ffile-prefix-map,对于绝大多数编译选项已经映射为同一路径,以便缓存命中。前提是所有 Doris 开发目录必须共享相同的父目录。 即所有 Doris 开发目录必须满足如下并列关系:

xxx/doris_main
xxx/doris1
xxx/doris2

2. 环境配置

2.1 配置 UBSAN_IGNORELIST 硬编码路径

除上述自动设定外,硬编码路径仍需要手动调整。在 worktree 目录的 custom_env.sh 中硬编码主库的 UBSAN IGNORELIST:

export UBSAN_IGNORELIST=${DORIS_MAIN_REPO}/conf/ubsan_ignorelist.txt

其中 DORIS_MAIN_REPO 是主库的路径。推荐做法:

  1. 将该值直接配置在主库的 custom_env.sh 中。
  2. 通过 hooks/setup_worktree.shAGENTS.md 的配合,由 AI 工作流自动传递给所有 worktree 目录。

2.2 扩大 ccache 缓存容量

为保证缓存空间足够,请手动扩大 ccache 缓存容量:

ccache --set-config=max_size=50G
配置项推荐值说明
max_size50G多 worktree 并行时建议的最低容量

3. 调试方式

3.1 查看缓存统计

通过 ccache -s 查看缓存统计,确认缓存是否生效。重点关注 cache hit rate 字段,如果值过低说明缓存未正确命中。每次观测前可以通过 ccache -z 清空统计,确保结果准确。

命令用途
ccache -s查看缓存命中统计
ccache -z清空统计信息(不清空缓存)
ccache -C清空缓存(慎用)

3.2 开启 ccache Debug 日志

确认缓存命中有问题时,可以开启 ccache Debug 日志:

export CCACHE_LOGFILE=/path/to/xxx
export CCACHE_DEBUG=1
环境变量作用
CCACHE_LOGFILE详细日志输出文件,可查看每次缓存命中/未命中的原因
CCACHE_DEBUG=1为每个编译单元生成 *.ccache-input-text 文件,记录该单元输入信息

3.3 定位未命中原因

开启 CCACHE_DEBUG=1 后,每一个编译单元都会产生自己的 *.ccache-input-text 文件,记录该编译单元的输入信息,包括源文件路径、编译选项等。

理论上两个不同目录的相同文件,各自的 ccache-input-text 内容需要完全一致,才能命中 ccache 缓存。 对于未命中的文件,可以对比两侧 ccache-input-text 文件差异,明确未命中原因。

4. 常见问题(FAQ)

Q1:cache hit rate 始终为 0

检查所有 worktree 是否在同一父目录下;如果不在,CCACHE_BASEDIR-ffile-prefix-map 无法将路径映射为一致,缓存必然不命中。

Q2:缓存空间频繁淘汰

按 2.2 节扩大 max_size。多 worktree 并行场景下,建议至少 50 GB。

Q3:UBSAN_IGNORELIST 路径报错

worktree 目录下未通过 custom_env.sh 指向主库的 ignorelist 文件,参考 2.1 节配置。