Общий кэш BE для нескольких каталогов
При разработке Doris BE с помощью ИИ-агента часто приходится одновременно работать с несколькими ветками разработки в разных каталогах, используя git worktree или аналогичные подходы. Поскольку кэширование в ccache зависит от полных путей к файлам, ccache не может использовать кэш в разных каталогах, даже если содержимое cpp-файлов почти идентично. В результате код в каталоге worktree приходится компилировать с нуля, что значительно замедляет разработку. Для решения этой проблемы реализованы специальные оптимизации. Выполните настройку, как описано ниже.
1. Требования к каталогам
Doris уже задаёт CCACHE_BASEDIR и -ffile-prefix-map в файле конфигурации окружения, приводя пути в большинстве параметров компиляции к одному и тому же виду, чтобы обеспечить попадания в кэш. Обязательное условие: все каталоги разработки Doris должны находиться в одном родительском каталоге. То есть все каталоги разработки Doris должны располагаться на одном уровне, как в следующем примере:
xxx/doris_main
xxx/doris1
xxx/doris2
2. Настройка окружения
2.1 Настройка жёстко заданного пути UBSAN_IGNORELIST
Помимо автоматических настроек, описанных выше, необходимо вручную скорректировать жёстко заданный путь. В файле custom_env.sh каталога worktree явно задайте путь к UBSAN IGNORELIST основного репозитория:
export UBSAN_IGNORELIST=${DORIS_MAIN_REPO}/conf/ubsan_ignorelist.txt
Здесь DORIS_MAIN_REPO обозначает путь к основному репозиторию. Рекомендуемый порядок действий:
- Задайте это значение непосредственно в файле
custom_env.shосновного репозитория. - Используйте
hooks/setup_worktree.shсовместно сAGENTS.md, чтобы рабочий процесс с ИИ автоматически переносил это значение во все каталоги worktree.
2.2 Увеличение размера кэша ccache
Чтобы обеспечить достаточно места для кэша, вручную увеличьте максимальный размер кэша ccache:
ccache --set-config=max_size=50G
| Параметр | Рекомендуемое значение | Описание |
|---|---|---|
max_size | 50G | Минимальный рекомендуемый размер при одновременной работе с несколькими worktree |
3. Методы отладки
3.1 Просмотр статистики кэша
Выполните ccache -s, чтобы просмотреть статистику кэша и проверить, работает ли он. Обратите внимание на поле cache hit rate. Если значение слишком низкое, попадания в кэш происходят некорректно. Перед каждой проверкой выполняйте ccache -z, чтобы сбросить статистику и получить точный результат.
| Команда | Назначение |
|---|---|
ccache -s | Просмотр статистики попаданий в кэш |
ccache -z | Сброс статистики (без очистки кэша) |
ccache -C | Очистка кэша (используйте с осторожностью) |
3.2 Включение отладочного журналирования ccache
Убедившись, что есть проблема с попаданиями в кэш, включите отладочное журналирование ccache:
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: Коэффициент попаданий в кэш всегда равен 0
Проверьте, находятся ли все worktree в одном родительском каталоге. В противном случае CCACHE_BASEDIR и -ffile-prefix-map не смогут привести пути к единому виду и попаданий в кэш не будет.
Q2: Содержимое кэша часто вытесняется
Увеличьте max_size, как описано в разделе 2.2. При одновременной работе с несколькими worktree рекомендуется не менее 50 GB.
Q3: Путь UBSAN_IGNORELIST вызывает ошибку
В каталоге worktree через custom_env.sh не задан путь к файлу ignorelist основного репозитория. Инструкции по настройке см. в разделе 2.1.