Почему на удалённом Mac Git, Homebrew и npm часто дают таймауты и обрывы
Три основные причины:
- Большая RTT и потери пакетов. Трансграничные или удалённые каналы добавляют задержку и потери. Таймауты клиентов по умолчанию короткие; один медленный участок может прервать передачу.
- Маленькие буферы и отсутствие повторов. У Git по умолчанию небольшой
http.postBufferдля крупных push; HTTP-клиенты часто не повторяют запрос при временных сбоях. У Homebrew и npm похожие умолчания. - Нет переиспользования соединения. Повторные SSH-подключения (например для Git по SSH) каждый раз пересогласовываются. Без ControlPersist каждая операция clone или fetch платит полной ценой установки соединения и сильнее страдает от обрывов в середине передачи.
Раннеры CI на удалённом Mac усиливают проблему: много джоб параллельно клонируют и ставят зависимости, поэтому таймауты и повторы критичны для стабильности. Трансграничные команды чаще всего сталкиваются с этим, когда узел Mac и апстрим Git/npm/Homebrew находятся в разных регионах.
Git: исполняемые параметры таймаута и повтора (http.postBuffer, timeout, ControlPersist)
Используйте эти настройки глобально или для репозитория, чтобы снизить таймауты и улучшить поведение при повторах.
Буфер HTTP и правила низкой скорости (таймаут):
git config --global http.postBuffer 524288000
git config --global http.lowSpeedLimit 1000
git config --global http.lowSpeedTime 60
Пояснение: postBuffer 500 МБ для крупных push; lowSpeedLimit (байт/с) и lowSpeedTime (секунды) вместе задают таймаут передачи (например прервать, если < 1000 байт/с в течение 60 с).
Опционально — таймаут HTTP (секунды): git config --global http.version HTTP/1.1 может помочь за частью прокси. Для жёсткого таймаута: git config --global http.lowSpeedTime 120 (увеличьте при очень медленных каналах). В CI задавайте эти параметры через git config в джобе или в глобальном конфиге образа раннера.
Переиспользование SSH (ControlPersist): добавьте в ~/.ssh/config для хоста (например Host github.com):
Host github.com ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p ControlPersist 600
Создайте каталог: mkdir -p ~/.ssh/sockets. Новые соединения переиспользуют мастер-сессию 600 секунд, что снижает переподключения и сбои в середине clone.
Homebrew и npm: настройка повторов и таймаутов по шагам
Homebrew. Задайте число повторов и при необходимости быстрый core remote:
export HOMEBREW_CURL_RETRIES=5 export HOMEBREW_CORE_GIT_REMOTE="https://github.com/Homebrew/homebrew-core.git" # Опционально: зеркало # export HOMEBREW_BOTTLE_DOMAIN="https://mirror.example.com"
Добавьте экспорты в ~/.zshrc или в окружение CI. На нестабильных сетях увеличьте HOMEBREW_CURL_RETRIES.
npm. Повторы и таймауты (в .npmrc или через переменные окружения):
fetch-retries=5 fetch-retry-mintimeout=20000 fetch-retry-maxtimeout=120000 fetch-timeout=300000
Время в миллисекундах. Для CI часто важнее зеркало реестра или прокси, чем только эти параметры; комбинируйте с таблицей ниже. Задайте их в проекте в .npmrc или в окружении CI, чтобы каждый запуск использовал одну и ту же политику повторов и таймаутов.
Своё зеркало vs прокси vs публичное зеркало: сравнение
Выбор зависит от сценария, возможностей по сопровождению и затрат.
| Вариант | Лучше всего для | Скорость / стабильность | Затраты / поддержка |
|---|---|---|---|
| Публичное зеркало | Быстрое решение без своей инфраструктуры | Хорошо, если регион совпадает | Бесплатно; возможны лимиты или ограничения SLA |
| Прокси (HTTP/SOCKS) | Снятие блокировок и единая точка выхода | Зависит от расположения и пропускной способности прокси | Затраты на прокси; минимум настроек в приложениях |
| Своё зеркало | Полный контроль, интенсивный CI | Максимум при близости к раннеру | Хранилище и синхронизация; сопровождение на вас |
Для удалённого Mac в CI: начните с публичного зеркала или прокси, если раннер трансграничный; переходите на своё зеркало при необходимости максимальной стабильности и возможности запускать задачи синхронизации. Подробнее: гид по зеркалу Git и прокси и ускорение трансграничной загрузки.
Итоги и рекомендации
- Увеличьте Git
http.postBuffer, задайтеlowSpeedLimitиlowSpeedTime, включите SSH ControlPersist для переиспользования соединения. - Задайте Homebrew
HOMEBREW_CURL_RETRIESи при необходимости core remote или зеркало bottle; для npm —fetch-retriesи таймауты (и зеркало реестра при необходимости). - Выберите зеркало, прокси или своё зеркало по таблице выше; комбинируйте с shallow clone или кешем где возможно (см. статью про стратегию кеша).
- Краткий чеклист: буфер и lowSpeed* для Git заданы; SSH ControlPersist настроен; повторы Homebrew и повторы/таймауты npm заданы; зеркало или прокси выбраны и применены. После каждого изменения перезапускайте падающий clone или установку для проверки.
Стабильный узел удалённого Mac снижает количество сбоев при загрузке и падений CI. MacPull предоставляет выделенные инстансы Mac Mini (в том числе M4) с SSH/VNC — вы получаете фиксированное окружение и предсказуемую сеть в выбранном регионе. Примените чеклист выше на своём раннере, затем ознакомьтесь с тарифами и оформлением аренды или главной — просмотр без входа. Ещё материалы: блог.
Стабильный удалённый Mac для Git, Homebrew и npm
Арендуйте Mac Mini M4 для надёжной загрузки кода и зависимостей и стабильного CI. SSH/VNC включены. Тарифы и оформление аренды — без входа. Или читайте другие статьи в блоге.