Перейти к содержимому
Последнее обновление

Общий кэш 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 обозначает путь к основному репозиторию. Рекомендуемый порядок действий:

  1. Задайте это значение непосредственно в файле custom_env.sh основного репозитория.
  2. Используйте hooks/setup_worktree.sh совместно с AGENTS.md, чтобы рабочий процесс с ИИ автоматически переносил это значение во все каталоги 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​

Убедившись, что есть проблема с попаданиями в кэш, включите отладочное журналирование 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.