2026年:リモートMac CIでのControlMasterと長時間rsync/SFTP
GitHub ActionsからリモートMacへ成果物を送るときの誤解は「帯域不足」です。実際にはDNS解決、TCP、SSH鍵交換、認証、チャネル確立が短いジョブを高頻度で繰り返すと、転送バイトより先に壁になります。ControlMasterはマスターソケットを再利用して再握手を圧縮しますが、同一ControlPathを共有する並列rsyncはSSH層で直列化され、スループット曲線がのこぎり状になります。
NATやロードバランサのアイドルタイマは多重化では消えません。大容量アーカイブをローカルで固めている間にアプリケーションバイトが流れないと、中間装置は状態を破棄します。ServerAliveIntervalとClientAliveIntervalを厳しい側に揃え、最後に書かれたバイト時刻とログを突き合わせてください。
known_hostsやIPv6の揺らぎは再利用でも残ります。AAAAが切り替わると最初の失敗がマスター状態に影響するため、環境ごとにHost別名を分け、期待フィンガープリントを文書化します。人間用SFTPとCI用転送はLinuxユーザか別名で分離し、デバッグ中のssh -O exitが本番アップロードを巻き添えにしないようにします。
観測の三層
L1は接続、L2は多重化ヒット率とマスター寿命、L3はrsync速度とchecksumゲートの終了コードです。L1とL2が不安定なのにL3だけ最適化しても効果は限定的です。MaxSessionsやMaxStartupsは並行SFTPの記事と同じダッシュボードで追い、Runner出口NATの再利用周期も併記します。
数値とNAT
大陸間でハンドシェイク120〜400msは珍しくなく、1分間に10回の短い同期なら毎時数分のオーバーヘッドになります。multiplex命中後はミリ秒台で再開できても、単一TCP流の上限は暗号と輝度に縛られます。NATの300/600/900秒窓に合わせServerAliveInterval 30とServerAliveCountMax 4を基線化し、リモートMac側のClientAliveIntervalより厳しい側を採用します。巨大tarballではディスク書き込みが支配的で、段階的checksum設計が先です。
意思決定マトリクス
| 状況 | 方針 | 利点 | リスク |
|---|---|---|---|
| 小さな差分が多い | ControlMaster auto+短いControlPersist | 尾遅延削減 | マスター破損時の復旧手順が必要 |
| マトリクス並列が高い | ControlPath分割または無効 | 直列化回避 | 握手コスト増 |
| 長大転送+ゲート | 専用CIユーザー | 再接続減 | keepalive必須 |
| 人とCI共有 | 別Hostと別パス | 誤操作低減 | 設定分岐増 |
| 厳格コンプライアンス | persist短縮またはoff | 露出時間短縮 | CPU負荷増 |
手順(How-to)
# ~/.ssh/config 例
# Host rm-ci
# HostName remote.mac.example
# User ciupload
# IdentityFile ~/.ssh/id_ed25519_ci
# ControlMaster auto
# ControlPath ~/.ssh/cm/%r@%h:%p
# ControlPersist 10m
# ServerAliveInterval 30
# ServerAliveCountMax 6
# ConnectTimeout 15
# rsync -avz -e "ssh -F ~/.ssh/config" ./dist/ rm-ci:~/artifacts/
ステップ1:multiplex無しで同一rsyncを三回測り、CPUと合計時間を記録します。
ステップ2:ControlMaster autoと非世界読み取り可能なControlPathを追加します。
ステップ3:マトリクスで衝突する場合はアカウント・ポート・サブディレクトリでControlPathを分割し、待ち行列が消えるか確認します。
ステップ4:ServerAliveIntervalとClientAliveIntervalをNAT窓より短く揃え、並行SFTP記事と整合させます。
ステップ5:known_hostsとStrictHostKeyCheckingをRunnerイメージに焼き込み、multiplexでも対話が出ないようにします。
ステップ6:partialとSHA256ゲートをマスター再生成でも冪等にします。
ステップ7:multiplex無効のHost別名を文書化します。
関連読みとCTA
推奨順:本稿→known_hosts→並行SFTP→IPv6→完全性→トップ。
FAQとマネージドMac
ControlPersistの長さは?
ジョブ周期とセキュリティ方針に合わせRunbookへ。ローカル~/.ssh私的変更は禁止に近い扱いが安全です。
ProxyJump併用は?
可。ただしControlPathで直達とジャンプを識別できる名前にします。
まとめ:ControlMasterは握手税対策ですが、並列・NAT・セッション上限・checksumゲートと一体で設計し、無効化ルートを残してください。
限界:DNSやデュアルスタック、企業プロキシが不安定ならL1の問題であり、multiplexは失敗を早めるだけです。
対比:SFTPMACの常時オンリモートMacは、安定した入口・keepalive既定・権限境界を製品化し、チームが夜間のNATログ調査から解放されやすくします。
多重化・keepalive・フィンガープリントを四半期レビューへ。
