Командам монорепо на параллельных узлах Mac mini M4 между регионами нужны дешёвые уведомления о файлах, ограниченный параллелизм компиляции и диск с запасом до DerivedData. Ниже — матрица решений: Watchman и опрос Git, защита от шторма событий файловой системы, пороги троттлинга компиляции в связке с build lock и чек-лист приёмки для томов 1 ТБ / 2 ТБ в эксплуатационных runbook.

Почему удалённый кластер Mac усиливает боль watcher’ов и диска

Удалённый кластер Mac умножает частоту checkout и пересборок: несколько агентов на схожем дереве дают всплеск vnode и FSEvents ещё до стадии линковки — это и есть шторм событий. Без лимитов кремний M4 уходит на инвалидацию графов зависимостей, а не на компиляцию. Трансграничная задержка добавляет гонки при синхронизации кэшей; контрольную плоскость (DNS к реестру, единый promote) держите согласованным с матрицей split DNS и реестра артефактов.

  • Fan-out watcher’а: корни по умолчанию, куда попали артефакты сборки или каталоги пакетного менеджера, многократно размножают уведомления между параллельными job.
  • Неограниченный параллелизм: без потолка числа тяжёлых lane на общем APFS растёт дрожь IO и массовая инвалидация кэшей в один момент.
  • Дрейф водяного знака диска: симуляторы, контейнеры и «золотые» деревья тихо съедают запас до обрыва линковки посредине пайплайна.

После сборки движение артефактов выравнивайте с матрицей rsync для межрегионального кластера Mac mini M4. Вопросы доступа и оплаты — в разделе «Помощь»; обзор всех материалов — в ленте технического блога.

Watchman и опрос Git: сопоставление для монорепо CI

Watchman даёт быстрый инкрементальный граф на Apple Silicon; опрос Git обменивает задержку на предсказуемость, когда давление на watcher уже бьёт по SLO. Закрепите режим по пулу и версии toolchain — не смешивайте политики на одном томе без разделения каталогов.

Сигнал Приоритет Watchman Приоритет опроса Git
Целевая задержка Субсекундная инвалидация при жёстких ignore. Секунды и десятки секунд; устойчиво при сильном churn.
CPU на M4 при всплеске Низкий при узких корнях; скачок, если ignore «течёт». Предсказуемые всплески, привязанные только к интервалу опроса.
Операционный риск Нужна гигиена watchman watch-del-all между job. Риск пропустить быстрые локальные правки без агрессивного интервала.
Дефолт кластера Основной режим для Metro, RN, крупных JS-графов. Запасной путь при давлении sysctl или провале SLO по шторму.

В репозитории зафиксируйте общий .watchmanconfig с исключениями node_modules, Pods, build и объектов SCM — отсутствие ignore на общем пуле блокирует релиз сильнее, чем редкий флапающий тест.

{
  "ignore_dirs": [
    "**/node_modules",
    "**/.git/objects",
    "**/Pods",
    "**/DerivedData"
  ],
  "settle": 20
}

Порог settle поднимайте к 40–80 мс, когда счётчики шторма растут; при стабильном шуме от генераторов кода рассмотрите отдельный корень watcher только для пакетов приложения.

Ограничения sysctl и ФС, параметры троттлинга

Настройку watcher’ов сопрягайте с потолками хоста: один job не должен исчерпать дескрипторы в разгар шторма событий. Перед расширением parallel на M4 снимите ulimit -n и пиковые открытые файлы в типичном прогоне.

  • Дескрипторы: держите лимит открытых файлов минимум в от пикового числа хендлов; иначе для тяжёлых lane включайте fallback на опрос Git.
  • Троттлинг компиляции: тяжёлые Swift или LTO ограничьте 2–4 параллельными процессами на тир 16–24 ГБ ОЗУ, пока гистограмма ожидания lock не сузится.
  • Пакетирование подготовки: группируйте шаги с массовой записью на диск, чтобы Watchman видел один всплеск, а не сотни микрозаписей.

Ниже — исполняемые примеры: сначала только чтение, постоянные значения согласуйте с эксплуатацией и зафиксируйте в sysctl.conf / launchd для пользователя CI.

# Диагностика (пользователь CI)
sysctl kern.maxfiles kern.maxfilesperproc
ulimit -n

# Пример сессионного поднятия лимита (перед боем — согласование с ops)
sudo sysctl -w kern.maxfiles=200000
sudo sysctl -w kern.maxfilesperproc=65535
ulimit -n 65535

Согласование watcher’ов с build lock большого монорепо

Ручки троттлинга бессмысленны без единственного писателя promote. Повторите связку планировщика и flock из материала Nomad, аффинити batch и build lock с порогами диска: пока lock занят, не поднимайте агрессивные корни Watchman на общем дереве.

Если среднее ожидание lock превышает три минуты на двух подряд релизах, сначала уменьшите count компиляторных lane на единицу, и только потом копайте дефекты тулчейна.

Рекомендуемые пороги алертов по заполнению диска (1 ТБ и 2 ТБ)

Заполнение APFS трактуйте как шлюз выкладки для смеси Xcode и контейнерного CI на хостах Mac mini M4: одинаковые проценты на 1 ТБ и 2 ТБ имеют разный запас по гигабайтам, но одинаковую критичность для снимков и кэшей.

Заполнение Приёмка 1 ТБ Приёмка 2 ТБ Серьёзность алерта
< 70% Зелёная зона: обычная одновременность; ротация логов раз в неделю. Зелёная зона: допускаются лишние симуляторы; spread по узлам. Только информационный дайджест.
70–80% Жёлтая зона: план выселения DerivedData; заморозка новых снимков. Жёлтая зона: пересмотреть prefetch артефактов на job. Еженедельная сводка дежурному.
80–90% Красная линия: план перехода на 2 ТБ или вынос; пауза лишнего batch. Красная линия: не ставить новые тяжёлые job, пока не вернётся запас. Немедленный тикет; рискованные пайплайны — стоп.
> 90% Падение сборок: обрывы артефактов и хуков вероятны. Жёсткий стоп promote; дренаж узла при устойчивом состоянии. Sev-1; заморозка записи в общие деревья кластера.

Чек-лист приёмки: зонд свободного места APFS; дедупликация алертов по хосту раз в пять минут; тикет на ёмкость, если жёлтая зона держится 48 ч; те же ворота для rsync после promote.

70%
Первая линия планирования для пулов 1 ТБ с еженедельными релизами.
80%
Порог перед постановкой новых дискоёмких job в очередь.
90%
Жёсткий шлюз: остановить promote и дренировать общие деревья.

Шестишаговый runbook внедрения

  1. Замерьте объём уведомлений на job с логированием Watchman, затем выкатите общий .watchmanconfig с ignore.
  2. Задайте потолки параллельной компиляции по тиру памяти и фиксируйте гистограммы ожидания lock после каждого релиза.
  3. Выровняйте sysctl и ulimit в golden-образе до добавления новых узлов в удалённый кластер Mac.
  4. Подключите дисковые пробы к жёлтой и красной зонам выше; дублируйте алерты в инструмент инцидентов.
  5. Опишите запасной сценарий с опросом Git на «штормовые» дни и положите ссылку рядом с runbook планировщика.
  6. Пересчитайте матрицу после каждого крупного апгрейда Xcode или базового контейнера — пороги сдвигаются вместе с размером кэшей.

FAQ

Заменяет ли Watchman планировщик? Нет — он питает инкрементальные инструменты; размещение и lock остаются на стороне оркестрации.

Почему шторм возвращается? Новые пути покрытия или трассировки обходят ignore — в CI запретите запрещённые корни статическим правилом.

Опрос Git постоянно? Когда задержка укладывается в SLO без Watchman, а CPU хватает на интервал опроса по всему флоту.

Чтобы не упираться в жёлтую зону диска на первом же релизном спринте, заложите класс тома и число узлов заранее: откройте тарифы, выберите конфигурацию Mac mini M4 и оформите аренду на странице покупки — так проще выровнять пул под описанную матрицу и не ломать SLO watcher’ов.

Инженерные ориентиры. Изменения sysctl согласуйте с безопасностью; проценты заполнения предполагают APFS без скрытых внешних монтирований. Под регулируемое хранение пороги ужесточайте.
Параллельный CI на Mac mini M4

Узлы с запасом под watcher’ы и диск

Сопоставьте тарифы 1 ТБ или 2 ТБ с матрицей водяных знаков: откройте тарифы без входа, оформите выделенный Mac mini M4, когда очереди не хватает ещё одного компиляторного lane; нюансы доступа — в разделе помощи, сценарии кластера — в блоге.

Арендовать Mac mini M4 Сравнить тарифы