Почему удалённый кластер 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 и пиковые открытые файлы в типичном прогоне.
- Дескрипторы: держите лимит открытых файлов минимум в 2× от пикового числа хендлов; иначе для тяжёлых 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.
Шестишаговый runbook внедрения
- Замерьте объём уведомлений на job с логированием Watchman, затем выкатите общий
.watchmanconfigс ignore. - Задайте потолки параллельной компиляции по тиру памяти и фиксируйте гистограммы ожидания lock после каждого релиза.
- Выровняйте sysctl и
ulimitв golden-образе до добавления новых узлов в удалённый кластер Mac. - Подключите дисковые пробы к жёлтой и красной зонам выше; дублируйте алерты в инструмент инцидентов.
- Опишите запасной сценарий с опросом Git на «штормовые» дни и положите ссылку рядом с runbook планировщика.
- Пересчитайте матрицу после каждого крупного апгрейда Xcode или базового контейнера — пороги сдвигаются вместе с размером кэшей.
FAQ
Заменяет ли Watchman планировщик? Нет — он питает инкрементальные инструменты; размещение и lock остаются на стороне оркестрации.
Почему шторм возвращается? Новые пути покрытия или трассировки обходят ignore — в CI запретите запрещённые корни статическим правилом.
Опрос Git постоянно? Когда задержка укладывается в SLO без Watchman, а CPU хватает на интервал опроса по всему флоту.
Чтобы не упираться в жёлтую зону диска на первом же релизном спринте, заложите класс тома и число узлов заранее: откройте тарифы, выберите конфигурацию Mac mini M4 и оформите аренду на странице покупки — так проще выровнять пул под описанную матрицу и не ломать SLO watcher’ов.
Узлы с запасом под watcher’ы и диск
Сопоставьте тарифы 1 ТБ или 2 ТБ с матрицей водяных знаков: откройте тарифы без входа, оформите выделенный Mac mini M4, когда очереди не хватает ещё одного компиляторного lane; нюансы доступа — в разделе помощи, сценарии кластера — в блоге.