2026: SSH с macOS при большом RTT — IPQoS, сжатие и шифры, прежде чем винить облачный Mac mini
Разработчики, арендующие Mac mini ProxyMac в Гонконге, Японии, Корее, Сингапуре или США, часто видят круговую задержку (RTT) 120–220 мс с европейского или западноамериканского ноутбука — и сразу подозревают «битый» CPU в облаке. В инцидентах, которые мы разбираем, больше половины тикетов «медленный SSH» закрываются только на стороне клиента OpenSSH в macOS: правка меток IPQoS, переключение сжатия, явный выбор AEAD-шифров и настройка ServerAlive до любой перепрошивки железа. В этом гайде — чеклист симптомов, три базовые метрики для вставки в постмортемы, матрица из четырёх рядов (без конфликта с MTU и планом регионов), рецепт из семи шагов для ~/.ssh/config и явные стоп-критерии, чтобы не провести выходные за микрооптимизацией шифров, пока настоящий враг — чёрная дыра PMTUD.
Вы также поймёте, когда эскалировать к выбору узла между регионами, а когда дополнять этот материал рецептами из справочного центра и сравнивать региональные SKU для следующего пилота.
Кто чувствует боль — и что значит «медленно»
Большой RTT не отменяет скорость света; он увеличивает число оконных круговых задержек до обратной связи для человека. Интерактивные оболочки страдают при RTT свыше ~150 мс: каждое обновление строкового редактора ждёт ACK, если клиент не конвейеризует агрессивно. scp многогигабайтных архивов Xcode болит, когда однопоточный TCP не заполняет канал — часто это стек клиента, а не SSD на mini. Screen Sharing усугубляет всё, но здесь фокус на OpenSSH 9.x в macOS 15 и стандартном sshd на арендованной машине.
- Лаг клавиш при «ровном»
ping: типичный признак ожидания планировщика каналов SSH, а не ICMP — важны IPQoS и загрузка CPU на шифрах. - Пропускная способность рушится после первого мегабайта: часто сжатие борется с уже сжатыми данными или bufferbloat на домашнем Wi‑Fi — не в ЦОДе.
- Обрывы ночью только на простаивающих вкладках: бытовые CPE сбрасывают NAT каждые 20–45 минут; без keepalive сервер думает, что сессия жива, а UI клиента уже замёрз.
Три цифры, которые должны попасть в любую записку по инциденту
Перед правкой конфигов вставьте это в чат, чтобы финансы коррелировали всплески с географией, а не с ощущениями.
| Метрика | Как снять | Здоровый ориентир к ближайшему узлу ProxyMac |
|---|---|---|
| ICMP RTT p95 | ping -c 50 host и смотреть хвост | 8–35 мс внутри APAC, 140–190 мс EU→US (ожидаемо, не дефект) |
| Однопоточный goodput SCP | scp -v large.bin host:~/ | Выше 35 % от заявленной скорости скачивания домашнего ISP на неконгестированном Wi‑Fi; ниже — смотреть эфир Wi‑Fi или MTU |
| Время рукопожатия SSH | time ssh -G host | head -1 плюс настенные часы до первого приглашения оболочки | Первая оболочка быстрее 2,5× RTT после кэша host key; дольше — DNS или перегруз KEX |
Ciphers не лечит чёрную дыру фрагментации.
Матрица: IPQoS, сжатие, шифры, keepalive
Каждую строку безопасно пробовать отдельно; в одном прогоне тестов комбинируйте не больше двух изменений, чтобы понимать причину выигрыша.
| Параметр | Когда уместен | Компромисс | Стартовое значение |
|---|---|---|---|
IPQoS | Массовый scp, rsync, git packfiles | Интерактив может казаться чуть менее «отзывчивым», чем с lowdelay | IPQoS=throughput для синхронизации файлов |
IPQoS | vim/emacs по SSH, обновления статуса tmux | Несколько процентов пикового bulk | IPQoS=lowdelay на хостах только для интерактива |
Compression | RTT >120 мс и полезная нагрузка — текст/логи | CPU на обоих концах; вредно для видео или предварительно сжатых артефактов | Compression yes для хвостов логов CI; no для передач .ipa |
Ciphers / MACs | Любой путь Apple Silicon ↔ Apple Silicon | Устаревшие списки ломают совместимость | Предпочитать chacha20-poly1305@openssh.com, запасной aes256-gcm@openssh.com |
Семь шагов: рецепт клиента macOS
- Создайте секцию Host по имени региона mini, например
Host proxymac-jp, чтобы эксперименты не залезли на личные Git-хосты. - Зафиксируйте KEX и шифры явно: OpenSSH и так выберет безопасные дефолты, но закрепление убирает переменную в инциденте — добавьте
KexAlgorithms curve25519-sha256и выбранную пару AEAD выше. - Поставьте
IPQoS throughputдля ночных бэкапов; дублируйте секцию сIPQoS lowdelayдля интерактивных сессий, если живёте в vim. - Переключайте сжатие по секциям; не включайте глобально
Compression yes, если не хотите объяснять руководству отрицательный прирост скорости. - Добавьте keepalive:
ServerAliveInterval 30иServerAliveCountMax 4— та же логика, что в мультиплексировании ControlMaster; большой RTT усиливает потери на простое. - Снова замерьте: после каждого изменения заполните таблицу из трёх метрик; если RTT улучшился меньше чем на 3 %, а CPU удвоился — откатите.
- Задокументируйте победившую секцию рядом с hostname во внутренней вики и дайте ссылку на статью справочного центра, которую реально прочитают стажёры.
Пример секции (дублируйте с IPQoS lowdelay для интерактивных хостов, если разделяете профили):
Host proxymac-jp
HostName mini.example.jp
User youruser
IPQoS throughput
Compression yes
Ciphers chacha20-poly1305@openssh.com
ServerAliveInterval 30
ServerAliveCountMax 4
После того как конфиг попадёт в git, попросите команду на слепой A/B по десять минут: половина на старых дефолтах, половина на новой секции — соберите субъективную задержку по шкале 1–5 и приложите таблицу к тикету инфраструктуры вместе с цифрами.
Когда пора перестать крутить ноутбук
Если ICMP RTT до выбранного региона более чем вдвое выше, чем до другого города ProxyMac, который всё ещё укладывается в требования по данным, прекратите править ssh_config и меняйте географию — в гайде по задержкам уже расписаны ожидания APAC против US. Аналогично: если по вечерам конкуренция за эфир Wi‑Fi взлетает вместе с домашним стримингом, никакая DSCP-метка на SSH не победит Ethernet на 45-минутной отдаче. И наконец, если traceroute три дня подряд показывает потери на одном и том же транзитном AS, откройте тикет по пути с выводами MTR из плейбука MTR, а не гонитесь за наборами шифров.
ForwardAgent yes вместе с долгоживущими multiplex-мастерами превращает украденный ноутбук в мгновенное боковое перемещение — сочетайте настройку производительности с короткоживущими ключами из базового уровня SOC.
FAQ
Отличается ли ssh от Apple от варианта из Homebrew? Для QoS-меток и песочницы — да; тестируйте тот бинарник, который реально вызывают скрипты; в CI контейнеры часто идут другими путями, чем интерактивный профиль Terminal.
Включать ли ControlMaster на «спутниковых» линках? Часто да — см. отдельную статью — но помните: один залипший мастер тормозит все подчинённые сессии, пока не разберётесь.
Есть ли специфичные для ProxyMac серверные ручки? У клиентов редко бывает root на общих образах; считайте sshd только для чтения и работайте с клиентом, путём и регионом.
Почему Apple Silicon Mac mini всё ещё важен, когда клиент уже настроен
После выравнивания IPQoS, сжатия и keepalive оставшийся запас даёт железо без дрожи, когда прилетают десять параллельных sftp: M4 на узлах ProxyMac держит SSH-эндпоинты в HK / JP / KR / SG / US отзывчивыми в штормах CI, нативно крутит macOS-тулчейны, которые нужны джобам, и сочетается с той же экономикой аренды, что вы уже используете для пар VNC. Зафиксируйте победившую секцию Host рядом с SKU региона, добавьте ссылку на этот гайд в онбординг и освободите mini по завершении нагрузки — тюнинг дешевле, когда на том конце предсказуемое «голое» железо, а не перегруженная ВМ с притворством «это Mac».
Настроенный клиент — рядом с правильным регионом
Mac mini в HK / JP / KR / SG / US с готовым SSH при выдаче