並聯叢集為何常在沒有護欄時卡死
本文給同時運行 2–8 台專用 Mac 節點的平臺/DevOps 負責人:收斂決策矩陣、rsync 參數表、flock 建置鎖、1TB/2TB 擴容水位、跨區延遲驗收清單,可直接貼進 runbook。若你剛接觸雲端獨占 Mac,可先讀《2026 年自由工作者 Mac mini M4 租用實戰心得》建立成本與工作流觀念;更多主題見技術部落格首頁。
- 產物裂腦:兩個 Job 同時發布同一目錄,出現撕毀的 framework 或寫到一半的符號。
- 同步風暴:跨區全量複製塞滿上行,互動式開發者的編譯被擠爆。
- 磁碟斷崖:DerivedData 與封存檔默默灌滿 APFS,遠端快取在編譯中途失敗。
決策矩陣:拓樸與約束
| 模式 | 最適場景 | 風險 |
|---|---|---|
| 單一寫入者+提升(promote) | 需要嚴格產物溯源與簽章 bundle。 | 寫入節點成熱點。 |
| 從 golden 節點 rsync 扇出 | 讀多寫少的工作節點與可增量二進位。 | 搭配下文頻寬/逾時上限可預測。 |
| 物件儲存前置 | 巨型產物與多雲 egress 合約。 | 在 macOS 上整合成本較高。 |
多數團隊會先採 rsync 扇出:語意貼近本機維運習慣,路徑仍是 POSIX,腳本遷移成本低。務必搭配單一提升階段,讓 QA/發布永遠只從「祝福過」的目錄拉取。
參數化 rsync:今天就能跑的範例
為每個區域匯出小型 PROFILE,避免值班時臨時拼旗標。下列範例將 golden 主機上的 BUILD_ROOT 扇出到工作機:含校驗、可續傳、頻寬上限與牆鐘逾時(/usr/bin/timeout)。
#!/usr/bin/env bash
set -euo pipefail
PROFILE="${1:-apac}"
case "$PROFILE" in
apac) BW="60000"; TIMEOUT="25m";;
amer) BW="45000"; TIMEOUT="35m";;
*) BW="30000"; TIMEOUT="40m";;
esac
/usr/bin/timeout "$TIMEOUT" rsync -azh --delete-delay --partial \
--checksum --bwlimit="$BW" --omit-dir-times \
"$GOLDEN_HOST:$GOLDEN_PATH/" "$LOCAL_ARTIFACT_ROOT/"
| 旗標/指令 | 用途 | 備註 |
|---|---|---|
| --delete-delay | 延後刪除至同步成功結束前再套用。 | 降低長傳輸期間「半套目錄」暴露時間。 |
| --partial | 保留未完成檔以利續傳。 | 與 timeout 併用,避免 rsync 掛死佔連線。 |
| --bwlimit | 單流 KiB/s 節流。 | 依方案頻寬與互動式需求調整,避免擠爆同節點其他 Job。 |
| /usr/bin/timeout | 牆鐘上限(如 25m、35m)。 | 結束碼 124 代表逾時,應打點監控/告警。 |
建置鎖:保護共用產物樹
以互斥 flock 包住「編譯完成後的發布/提升」步驟,確保同一時間只有一個 Job 變更正式產物路徑。鎖檔放在本機快速卷或極小的 NFS metadata 切片;避免在高延遲 SSHFS 上長期持鎖。
LOCK_FILE="/var/tmp/ci-artifact-promote.lock"
flock -n "$LOCK_FILE" bash -c '
./scripts/compile.sh
rsync -az --delete ./out/ "/Volumes/Artifacts/promote/"
' || { echo "lock busy"; exit 17; }
1TB/2TB 擴容水位
2TB 方案能容納多組模擬器快取與容器層,但仍需自動化治理;九成使用率視為硬停止線,因 APFS 快照與本機備份片段會吃掉隱形空間。發版週前請先到算力與儲存方案頁比對 tier,避免 IO 飽和時才臨時加購。
跨區延遲驗收清單
- SSH 控制面:自辦公室 VPN 到各節點類型,往返延遲中位數 < 70 ms。
- rsync 穩態:每週至少一次帶校驗的 dry-run/實傳成功通過。
- Git fetch:對支援的最大 mono-repo 切片,clone 或 fetch < 5 分鐘。
- 互動 VNC:事故時兩人共用節點,影格節奏仍穩定可操。
若人在東南亞、編譯卻在美西,建議在新加坡或香港加一層中繼扇出,縮短 rsync 腿長;法遵若堅持美國簽章金鑰,也可把「簽章」與「編譯扇出」拆到不同地理的節點組合。
五步上線檢核(runbook)
- 每個地理區選定 golden 節點,文件化 SSH host alias。
- 建立帶 timeout、bwlimit 的各 PROFILE rsync 腳本並版本控管。
- 僅在「提升/產物輪替」路徑加 flock,編譯階段維持並行。
- 磁碟探針在 80% 使用率接通報/值班。
- 每次 VPN、ISP 或骨干調整後重跑本節延遲清單。
HTTP 健康檢查同樣需要牆鐘紀律,與 rsync 一致。可執行範例:
curl --max-time 8 --connect-timeout 3 -fsS \ https://status.example.internal/artifact-ready >/dev/null
FAQ:維運與採購語境
Git 能取代 rsync 嗎? 原始碼仍以 Git 為準;大型二進位、模擬器 runtime、DerivedData 型目錄適合 rsync,以增量 IO 同步而不改寫歷史。
flock 一直失敗怎麼辦? 代表臨界區太大;把鎖縮小到「提升/發布」即可,各分支編譯階段維持並行。
何時需要第二個地理區? 當延遲清單在一個迭代內兩次未過關,應拆分寫入/扇出拓樸,並在每次 VPN/ISP 變更後重跑探針,儀表板數字才可信。