2026リモートMacCISSHControlMasterControlPersistrsyncSFTPkeepalive

2026 リモートMac CI:SSH ControlMaster・ControlPersist・長時間rsync/SFTPとkeepalive意思決定マトリクス

GitHub ActionsからリモートMacへ成果物を送る遅延の多くはSSHハンドシェイク税です。多重化は並列とNATとchecksumゲートと同時設計が必要。known_hostsやIPv6記事と併読。

ControlMasterControlPersistリモートMacrsyncCIkeepalive
2026 リモートMac CI SSH ControlMaster rsync SFTP keepalive

2026年:リモートMac CIでのControlMasterと長時間rsync/SFTP

GitHub ActionsからリモートMacへ成果物を送るときの誤解は「帯域不足」です。実際にはDNS解決、TCP、SSH鍵交換、認証、チャネル確立が短いジョブを高頻度で繰り返すと、転送バイトより先に壁になります。ControlMasterはマスターソケットを再利用して再握手を圧縮しますが、同一ControlPathを共有する並列rsyncはSSH層で直列化され、スループット曲線がのこぎり状になります。

NATやロードバランサのアイドルタイマは多重化では消えません。大容量アーカイブをローカルで固めている間にアプリケーションバイトが流れないと、中間装置は状態を破棄します。ServerAliveIntervalClientAliveIntervalを厳しい側に揃え、最後に書かれたバイト時刻とログを突き合わせてください。

known_hostsやIPv6の揺らぎは再利用でも残ります。AAAAが切り替わると最初の失敗がマスター状態に影響するため、環境ごとにHost別名を分け、期待フィンガープリントを文書化します。人間用SFTPとCI用転送はLinuxユーザか別名で分離し、デバッグ中のssh -O exitが本番アップロードを巻き添えにしないようにします。

観測の三層

L1は接続、L2は多重化ヒット率とマスター寿命、L3はrsync速度とchecksumゲートの終了コードです。L1とL2が不安定なのにL3だけ最適化しても効果は限定的です。MaxSessionsMaxStartupsは並行SFTPの記事と同じダッシュボードで追い、Runner出口NATの再利用周期も併記します。

数値とNAT

大陸間でハンドシェイク120〜400msは珍しくなく、1分間に10回の短い同期なら毎時数分のオーバーヘッドになります。multiplex命中後はミリ秒台で再開できても、単一TCP流の上限は暗号と輝度に縛られます。NATの300/600/900秒窓に合わせServerAliveInterval 30ServerAliveCountMax 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:ServerAliveIntervalClientAliveIntervalをNAT窓より短く揃え、並行SFTP記事と整合させます。

ステップ5:known_hostsStrictHostKeyCheckingをRunnerイメージに焼き込み、multiplexでも対話が出ないようにします。

ステップ6:partialとSHA256ゲートをマスター再生成でも冪等にします。

ステップ7:multiplex無効のHost別名を文書化します。

関連読みとCTA

推奨順:本稿→known_hosts並行SFTPIPv6完全性トップ

FAQとマネージドMac

ControlPersistの長さは?

ジョブ周期とセキュリティ方針に合わせRunbookへ。ローカル~/.ssh私的変更は禁止に近い扱いが安全です。

ProxyJump併用は?

可。ただしControlPathで直達とジャンプを識別できる名前にします。

まとめ:ControlMasterは握手税対策ですが、並列・NAT・セッション上限・checksumゲートと一体で設計し、無効化ルートを残してください。

限界:DNSやデュアルスタック、企業プロキシが不安定ならL1の問題であり、multiplexは失敗を早めるだけです。

対比:SFTPMACの常時オンリモートMacは、安定した入口・keepalive既定・権限境界を製品化し、チームが夜間のNATログ調査から解放されやすくします。

多重化・keepalive・フィンガープリントを四半期レビューへ。