2026: трансграничные команды — «интерактивная разработка» и self-hosted macOS runner в одном региональном пуле. Как мультирегиональные физические Mac избегают голодания очереди и конкуренции за ресурсы: выбор региона узла и матрица порогов сессия/CI (копируемые параметры + FAQ)
Когда физические Mac в нескольких регионах попадают в один бюджетный и учётный пул, командам одновременно нужны низколатентные интерактивные сессии и высокопроизводительный CI — без чётких порогов разделения появляются очереди runner, конкуренция диска между компиляцией и индексацией, «вечно второй» часовой пояс. Здесь — три матрицы для быстрого сканирования (нагрузка×стратегия пула, мультирегиональный аффинитет, пороги сессия/CI), готовые метки и фрагменты workflow, runbook на семь шагов, цифры для внутренних отчётов и раздел FAQ. Критерии выбора облачного Mac по региону — в руководстве по выбору региона облачного Mac в 2026; долгоживущие 7×24 агенты на физическом узле, которые соседствуют с планированием ёмкости, разобраны в материале об OpenClaw и ИИ-агентах на ZoneMac.
Введение: пул в регионе — не «все на одной ОС»
Пул в одном регионе — это единая ячейка FinOps, мониторинга и бюджета. Совмещать всё в одной инсталляции macOS — вынуждать Remote IDE и CI делить I/O и память в одном домене отказа; на Apple Silicon с тяжёлой записью на NVMe это рискованно. Мы исходим, что конфликты снимают очереди оркестратора, метки runner и потолки конкуррентности на хост, а не договорённости «пушьте не одновременно».
Получите: ① выводы нагрузка vs пул; ② компромисс близости Git/артефактов и RTT инженеров; ③ готовые к вставке метки и «ограждения» в workflow; ④ семиэтапный ввод в эксплуатацию и ответы в FAQ.
1. Три боли: голодание — редко «просто мало Mac»
- Два слоя очередей. В GitHub Actions и аналогах джоба ждёт слот concurrency или подходящий онлайн runner. Самообслуживаемый runner, который offline, с неверной меткой или не совпадает с
runs-on, даёт ложное голодание: очередь длинная, а «на бумаге» ёмкость есть. - Интерактив и CI делят кэш. Удалённая индексация IDE, симуляторы и
xcodebuild, пишущий Derived Data вместе, взвинчивают задержку NVMe — страдает и wall time CI, и отклик SSH. - Справедливость по часовым поясам. Без
concurrencyв разрезе региона/команды и окон для тяжёлых джоб «шторм пуша» в одной зоне съедает глобальные слоты — это планировщик организации, не Гц.
2. Матрица A: тип нагрузки × стратегия пула
Решите, что допустимо на одной физической машине, а что выносить в отдельные пулы или хосты.
| Нагрузка | Типичное узкое место | Рекомендуемая стратегия |
|---|---|---|
| Remote SSH / IDE | Долгие сессии, равномерный CPU, чувствительность к задержке | pool:interactive; отдельные тома от CI; лимит параллельных сессий на пользователя |
| Сборка PR + тесты | Пики памяти, диск, симуляторы | pool:ci-standard; старт с max_jobs=1–2 на хост |
| Релиз / подпись / загрузка | Резиденция секретов, сетевые «хвосты», compliance | pool:release; отдельно от ежедневного CI; при необходимости single-tenant Mac |
| UI / E2E / снапшоты | GPU, display server, чувствительность к флакам | Выделенные runner, фиксированное разрешение; не смешивать с «только компиляция» |
3. Матрица B: мультирегион и выбор узла
Близко к Git и близко к разработчику часто конфликтуют — используйте таблицу как первый компромисс.
| Что в приоритете | Кто выигрывает | Типичная цена |
|---|---|---|
| Git / артефакты / зеркала зависимостей | CI: clone, восстановление кэша, pull артефактов | Для удалённых инженеров растёт RTT без региональных интерактивных узлов |
| Инженеры, которые пишут код (макрорегион) | Remote SSH, ревью, пейринг | CI может требовать реплик чтения или согласованных окон merge с основным регионом репо |
| Compliance / юрисдикция ключей | Подпись, PII, аудит | Нельзя «незаметно» гонять кросс-региональные джоб — нужны явные environment и согласования |
Практичное правило: на каждую географию вынесите хотя бы zone:<регион>; глобальные ночные прогоны направляйте в pool:heavy с отдельной concurrency, чтобы не голодать региональные PR-пулы.
4. Матрица C: пороги разделения сессия/CI (старт — подтвердите нагрузочным тестом)
| Метрика / политика | Стартовый порог | Крутите, если видите… |
|---|---|---|
| Параллельных CI-джоб на физический Mac | 1 на unified-memory M; к 2 переходить только после стабилизации | OOM, SIGKILL, флак компиляции, рост сбоев симулятора |
| Конкуррентность workflow в репо | для PR: concurrency: group + cancel-in-progress; по умолчанию ≤4 параллельных workflow в регионе |
P95 очереди > 15 мин при пустых слотах — метки; при полных слотах — больше хостов или меньше параллелизма |
| Расклад диска интерактив vs CI | Отдельные APFS-тома или mount; жёсткие префиксы Derived Data | SSH «тупит» при нормальной сети; diskutil показывает всплески задержки записи |
| Справедливость (мультитаймзона) | Очереди с метками team/region; окна для тяжёлых джоб |
Регион хронически «второй в очереди» — пересмотрите concurrency и защиту веток |
5. Копируемые параметры (метки runner + скелет workflow)
Примеры в нотации GitHub Actions; перенесите в свой CI смысл меток, групп конкуррентности и настроек self-hosted.
5.1 Метки при регистрации runner
zone:apac
pool:ci-standard
os:macos
arch:arm64
capacity:shared
5.2 Workflow: пул + concurrency (фрагмент)
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: [self-hosted, macOS, ARM64, zone-apac, pool-ci-standard]
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
5.3 Переменные среды (поведение, не секреты)
# Снизить нагрузку индекса в CI
export COMPILER_INDEX_STORE_ENABLE=NO
# Derived Data на отдельный том
export DERIVED_DATA_PATH=/Volumes/ci-derived/PR-${{ github.run_id }}
Секреты подписи на общий пул по умолчанию не вешайте — используйте environment или релизные runner.
6. Runbook: семь шагов
- Теплокарта нагрузок: по репо и веткам — суточные количества джоб, пиковые часы и длительность.
- Закрепить грамматику меток:
zone/pool/capacityв RFC — без личных псевдонимов. - Разделить интерактив и CI: минимум — разные тома; интерактивные узлы могут не нести CI-меток.
- Конкуррентность и тайм-ауты: отдельные группы для PR и default; длинные шаги — отдельный workflow и больший
timeout-minutes. - Смотреть четыре недели: P95 очереди, доля offline runner, сбой джоб, RTT инженеров — в алерты.
- Квартальное масштабирование: чаще — больше слотов в регионе, а не слепой апгрейд одной машины.
- Описать откат: как вернуть метки, убийственные switch в workflow и on-call на «срочный release-хост».
7. Цифры для внутренних SLO и закупки
- Старт параллелизма: 1 CI-джоба на хост в проде; к двум — только после недельной стабильности.
- Алерт по очереди: региональное ожидание P95 > 15 минут в три подряд интервала — триггер ревью ёмкости.
- Интерактивный RTT: ориентир в одну сторону < 120 ms на основных путях Remote SSH; выше — сначала песочницы ближе, потом больше CI-Mac.
- Квартальный аудит: сопоставляйте живые машины ↔ метки, чтобы снятые хосты не оставались в workflow.
8. FAQ
Один пул в регионе = Remote SSH и CI на одной физической Mac?
Нет. Пул — граница FinOps. В норме подпулы interactive и ci (и дальше по мере необходимости), чтобы Xcode и линкер не дрались за unified memory и диск.
С чего смотреть голодание очереди?
Вместе: глубина очереди, занятость runner и RTT/обрывы интерактива. Глубокая очередь при пустых слотах — смещение меток или offline, не сырой дефицит кремния.
Как задать «максимум джоб на машину» в матрице?
С одной джобы, проверьте пик памяти и размер Derived Data, затем аккуратно две; откат при OOM и флаках. На unified memory меньше параллелизма часто надежнее, чем «две джобы ради квоты».
Мультирегион: куда вести runner — за Git или за инженером?
CI — к Git, артефактам, зеркалам. Remote SSH — к тем, кто пишет ежедневно. Конфликт — метками и пулами, не «одна машина на всех».
Один «жирный» Mac заменяет много мелких с разделением?
Память помогает, но запись на диск и флаки симулятора всё равно связывают интерактив и CI в одном домене отказа. Несколько горизонтальных Mac со строгими метками чаще выигрывают.
Как убрать ложное голодание при «мигании» self-hosted runner?
Супервизия процесса, автоперезапуск, сердцебиения и N+1 критичных пулов. Пока джобы в очереди, а online runner нет — сначала доступность, не поднятие конкуррентности.
Как это сочетается с merge queue и нагрузкой на trunk?
Очередь merge концентрирует default branch — вынесите merge_group в свой пул или окна и согласуйте с политикой trunk, чтобы PR-пулы не голодали.
9. Mac mini: стабильные пулы на классе «мини»
Метки, изоляция томов и 24/7-наблюдение удобнее сопровождать на Apple Silicon Mac mini: низкое энергопотребление в простое, тихое охлаждение, предсказуемая полоса памяти на пиках CI. macOS — те же OpenSSH, Git и Xcode, что в ноутбуках, без дыр WSL; Gatekeeper, SIP и FileVault снижают поверхность риска для длительных runner с кредами автоматизации.
Региональные пулы физических Mac и согласование конкуррентности оркестратора с лимитом на хост чаще стабилизирует P95 быстрее, чем погоня за гигагерцами. Mac mini M4 — сильный баланс стоимости, энергоэффективности и 7×24 для self-hosted. Сначала закрепите ADR с метками и порогами из раздела 7, затем посмотрите варианты на главной ZoneMac для пулов в ваших регионах.
Пулы self-hosted и интерактив на Mac mini
Облачные Mac с маршрутизацией по меткам и низкой задержкой — разделяйте сессии и CI без борьбы за один NVMe.