Команды, которые параллелят Xcode на нескольких Mac mini M4 в разных регионах clustervps и используют общий CephFS для артефактов, упираются в кеш клиента libcephfs, время сессии MDS и полосу rsync. Ниже — матрица с водяными знаками для томов 1 ТБ и 2 ТБ, исполняемые примеры лимитов и кеша, модель build lock и чек-лист, согласованный с JuiceFS cache и SeaweedFS rsync.
CephFS
единое пространство имён для артефактов и кеша клиента на кластере Mac
MDS
сессии метаданных должны переживать длинный rsync promote между регионами
bwlimit
жёсткая полоса rsync удерживает p99 задержки чтения для компилятора

Три узких места CephFS на межрегиональном CI

1. Клиентский кеш и устаревшие dentry. Слишком большой client cache на macOS клиенте держит старые inode после атомарной замены каталога rsync, и агенты CI видят частично обновлённое дерево, хотя сервер уже опубликовал новый снимок артефакта.

2. Преждевременное закрытие сессии MDS. Если mds_session_timeout короче длительности полного rsync при выбранном bwlimit, метаданные откатываются в середине передачи, а параллельные job-ы получают рассинхрон между узлами кластера и ложные ошибки линкера.

3. Неконтролируемая полоса rsync и отсутствие очереди. Несколько независимых rsync без flock и без снижения --bwlimit выедают uplink, рост очереди к MDS увеличивает задержку stat, а локальный APFS том на 1 ТБ быстрее приближается к жёсткому водяному знаку записи.

Матрица решений: кеш клиента, MDS, rsync и водяные знаки 1 ТБ / 2 ТБ

Паттерн нагрузки Клиентский кеш CephFS mds_session_timeout rsync политика Водяные знаки 1 ТБ / 2 ТБ
Частые мелкие записи DerivedData client_cache_size 512 МиБ, сброс после promote Не ниже трёхкратного p95 rsync Одна сессия, --bwlimit 45000, ionice idle жёлтый 0,72 ТБ / 1,44 ТБ, красный 0,93 ТБ / 1,86 ТБ, стоп 0,97 ТБ / 1,94 ТБ
Толстые tarball между регионами client_cache_size 1024 МиБ, без агрессивного readdir кеша p95 rsync плюс час запаса Две сессии максимум, backoff при ошибках сети принудительная очистка локального кеша при 0,82 ТБ / 1,62 ТБ
Несколько проектов на одном префиксе Минимальный кеш, строгий TTL dentry Согласовать с длиной merge окна Очередь flock на каталог, снижение bwlimit при load выше четырёх Без квоты per-tenant риск раньше 0,74 ТБ / 1,48 ТБ

Исполняемые примеры: размер кеша клиента и rsync с полосой

Фрагмент ceph.conf фиксирует верх кеша. Согласуйте с админом Ceph и политикой тенанта clustervps.

ceph.conf (клиент): ориентиры для согласования с версией Ceph; часть параметров задаётся на стороне кластера.
[client]
client_cache_size = 1073741824
client_oc_max_dirty = 100
mds_session_timeout = 180

rsync с --bwlimit в килобайтах в секунду; измерьте p95 длительности до фиксации mds_session_timeout.

rsync (ночное окно):
ionice -c 3 nice -n 10 rsync -aH --delete --partial \
  --bwlimit=45000 /local/build/out/ /mnt/cephfs/ci/prefix/out/

Второй канал между регионами — зеркальная команда с тем же bwlimit и отдельным логом до снятия flock.

Build lock для нескольких проектов на общем префиксе

Два репозитория на одном префиксе: подкаталоги и flock /mnt/cephfs/ci/global.lock до rsync. Паттерн Nomad и Xcode — в статье про Nomad affinity и build lock.

Шесть шагов внедрения на кластере Mac mini M4

  • Эталонный префикс и квота per tenant. Разведите каталоги по ACL, чтобы водяные знаки APFS отражали реальное потребление узла.
  • Метрики p95 rsync. Прогоните полный набор с bwlimit, затем mds_session_timeout не ниже трёхкратного p95.
  • client_cache_size и рестарт клиента. После ceph.conf перемонтируйте FUSE или kernel client и проверьте ceph config show.
  • ionice и очередь в launchd. Запретите второй rsync без успешного первого, логируйте коды выхода.
  • Водяные знаки и очистка. На жёлтом пороге чистите DerivedData и сжимайте параллелизм тестов; на красном блокируйте новые rsync.
  • Учение с обрывом линка. Проверьте восстановление сессии MDS и что promote не публикует частичное дерево без снятия lock.

Цифры для регламентов и постмортемов

  • Три параллельных тяжёлых rsync на один uplink считаются нештатными для узла с диском 1 ТБ; для 2 ТБ допускается третья сессия только при load average ниже двух и свободном остатке выше пятисот гигабайт.
  • Жёлтый водяной знак для тома 1 ТБ фиксируйте на доле 0,72 от номинала, для 2 ТБ на 1,44 ТБ, чтобы оставить запас под снапшоты APFS, логи агента и временные файлы линкера Swift.
  • client_cache_size один гигабайт является разумным стартом для толстых артефактов; для чисто метаданных нагрузок снижайте до 512 мегабайт и уменьшайте client_oc_max_dirty, чтобы не раздувать грязные страницы.
  • Контрольный интервал мониторинга по занятости MDS и задержке stat не реже одной минуты в рабочее окно rsync, иначе оператор заметит деградацию позже, чем канареечный узел Mac mini M4.

Схемы rsync без CephFS — в матрице артефактов; NFS — в разборе NFS merge.

FAQ: устаревшие метаданные после promote

При расхождении размера файла после rsync проверьте клиентский кеш и контрольное чтение inode с соседнего узла. Не открывайте параллельный promote без flock. Доступ и сеть — в справочном центре clustervps.

Итог для эксплуатации: CephFS на межрегиональном кластере Mac mini M4 остаётся предсказуемым, когда кеш клиента, таймауты MDS и полоса rsync согласованы одной матрицей, а дисковые водяные знаки 1 ТБ и 2 ТБ напрямую управляют параллелизмом синхронизации и очисткой кешей.
Масштабирование кластера clustervps

Добавьте узлы Mac mini M4 или диск 2 ТБ под CephFS и rsync

Оформите публичную аренду дополнительных физических Mac или перейдите на тариф с большим томом, чтобы удерживать жёлтые водяные знаки без остановки CI; тарифы и лимиты описаны на отдельной странице, а сценарии подключения — в справочном центре.

Купить или расширить узел Сравнить публичные тарифы