弄清楚为什么 ccache 缺失

loic

在编译 Ceph 时,ccache 可能会出现比预期更多的缺失,如 cache miss 行所示 ccache -s

缓存目录 /home/loic/.ccache 缓存命中(直接) 1 缓存命中(预处理) 0 缓存缺失 1 缓存中的文件 3 缓存大小 392 千字节 最大缓存大小 10.0 千兆字节

从两个不同目录中的克隆编译 Ceph 无法解释缺失,除非设置了 CCACHE_HASHDIR。应该取消设置它:

unset CCACHE_HASHDIR

虽然未将 CCACHE_BASEDIR 设置为源目录可能会导致缓存缺失,但在 Ceph 的情况下,这没有区别(或者区别太小而无法察觉),因为源目录的绝对路径不包含在正在编译的源中。
可以通过设置 CCACHE_LOGFILE 来生成解释 ccache 为什么未命中的详细输出

export CCACHE_LOGFILE=/tmp/cache.debug

可以使用以下脚本获取有关 ccache 在用于 Ceph 主分支的两个克隆中的行为的更多信息

export CCACHE_LOGFILE=/tmp/cache.debug git clone https://github.com/ceph/ceph.git cp -a ceph ceph-other cd ceph/src o=cls/replica_log/cls_replica_log_ops.o ccache -zC rm /tmp/a rm -f $o make $o ( cd ../../ceph-other/src ; rm -f $o ; make $o ) ccache -s

应该显示一个命中和一个缺失。

缓存目录 /home/loic/.ccache 缓存命中(直接) 1 缓存命中(预处理) 0 缓存缺失 1 缓存中的文件 3 缓存大小 568 千字节 最大缓存大小 10.0 千兆字节

如果不是,可以检查 /tmp/cache.debug 中的 ccache 日志。它包含用于预处理这两个文件的 CPP 行。可以再次运行它们并将输出进行比较,以了解两者的区别。