沒有 Nomad 護欄時,並聯叢集卡在哪
本文給同時養 2–8 台專用 Mac CI 節點的平臺/DevOps:用一張排程決策矩陣收斂 Nomad 約束,再用建置鎖與1TB/2TB 擴容水位表對齊磁碟與佇列,最後接到既有 rsync 製品扇出。延伸閱讀:《並聯叢集 rsync 決策矩陣》、《拆分 DNS 與內網製品庫矩陣》;若你剛評估雲端獨占 Mac,可先讀《自由工作者 Mac mini M4 租用實戰心得》。
- 區位漂移:batch 沒綁
meta,編譯在美西、簽章鑰匙卻在亞太,延遲與合規同時炸裂。 - 產物裂腦:兩個 allocation 同時 promote,目錄樹出現撕毀的 framework 或半成品符號。
- 磁碟與佇列共振:DerivedData、模擬器快取與 rsync 暫存一起頂到紅燈,Nomad 仍持續 dispatch,IO 打滿後隨機失敗。
決策矩陣:Nomad 排程策略與拓樸
| 策略 | 最適場景 | 取捨 |
|---|---|---|
| 客戶端 meta + constraint | 明確把 APAC/AMER batch 釘在對應 Mac 池;關鍵字 Nomad、區域標籤。 | 最直白;需統一 agent 設定與機器入池流程。 |
| spread/反堆疊 | 同一叢集多臺 Mac mini M4,避免 CPU 熱點全落單機。 | 調權重與屬性選擇要實測,否則排程抖動。 |
| 單群組 max_parallel=1 | 與 建置鎖二選一做「硬串列」;適合 promote/單寫入者目錄。 | 吞吐下降;與 flock 並用易成雙軌競態,應擇一為準。 |
| golden+工作節點 | 編譯在並聯池完成,正式樹由單節點提升,其餘靠 rsync 銜接。 | 與本文 rsync 段落自然接軌。 |
實務上會組合使用:用 meta/constraint 解「放哪裡」,用 spread 解「不要全塞同一臺」,再用單寫入者或 max_parallel 解「誰能碰正式產物路徑」。
HCL 片段層級說明與可執行 job 範例
以下用白話對應常見區塊(不必逐行背語法):頂層 job 設成 type = "batch",代表任務跑完就釋放資源,適合 CI 批次。group 裡的 constraint 把排程器篩選到帶特定 meta 的客戶端——這些鍵值應來自各臺 Mac 上 Nomad agent 的設定,與機房實際區域一致。task 內再放 driver = "exec" 或封裝腳本,承載編譯與後續 rsync 呼叫。
可直接存成 ios-batch-apac.nomad.hcl 後以 nomad job run 提交(請將 meta 鍵名與值改成你環境中 agent 已宣告的欄位):
job "ios-batch-apac" {
type = "batch"
group "build" {
count = 1
constraint {
attribute = "${meta.region}"
operator = "="
value = "apac"
}
task "compile" {
driver = "exec"
config {
command = "/bin/bash"
args = ["-lc", "/usr/local/bin/ci-build-and-sync.sh"]
}
resources {
cpu = 4000
memory = 8192
}
}
}
}
建置鎖:與 Nomad 佇列對齊
在「提升/發布」臨界區用 flock(或等價互斥)保證單一寫入者;鎖檔放在本機 SSD,避免遠端掛載持鎖。排程層若已對該路徑採 max_parallel = 1,就不要再叠一套長生命週期的腳本鎖,以免兩套規則互相卡死。
LOCK_FILE="/var/tmp/ci-artifact-promote.lock"
flock -n "$LOCK_FILE" bash -c '
/usr/local/bin/xcode-archive.sh
rsync -az --delete ./out/ "/Volumes/Artifacts/promote/"
' || { echo "lock busy"; exit 17; }
1TB/2TB 擴容水位決策矩陣
| 卷宗使用率區間 | 1TB 節點(並聯工作機) | 2TB 節點(並聯工作機) | Nomad 側建議 |
|---|---|---|---|
| < 70% | 維持現有 batch 並行;例行清理 DerivedData。 | 可保留較多模擬器/容器層;仍要監控快照。 | 正常 dispatch,僅記錄趨勢。 |
| 70%–80% | 黃燈:排程封存離線、評估升 2TB 或拆 golden。 | 黃燈:收斂非必要快取;規劃下一輪釋出週期。 | 降低低優先級 batch 並行或延後非關鍵 job。 |
| > 90% | 紅燈:暫停新扇出與大型 rsync,先釋放 APFS 可見與「隱形」空間(快照、本機備份片段)。 | 視為硬停:暫停 dispatch 直至監控回綠。 | |
與 rsync 製品同步的銜接點
Nomad task 完成編譯後,通常由腳本呼叫 rsync 將黃金目錄扇出到各區工作節點的 LOCAL_ARTIFACT_ROOT;參數化 profile(頻寬、校驗、牆鐘逾時)與「單一 promote」原則,請與前文所引《並聯叢集 rsync 決策矩陣》中的 runbook 對齊,讓排程與檔案層契約同一套版本控管。
FAQ
constraint 已寫死區域,為何還會漂? 常見原因是客戶端 agent 的 meta 與實際機房標籤不一致,或節點曾手動改過 meta 未重啟 agent;以 nomad node status 逐臺核對。
flock 與 max_parallel 可以一起用嗎? 可以,但只應保留一種「權威」串列機制;另一種僅作保險時要縮短持鎖時間,避免雙重等待。
1TB 節點能否硬扛多條並聯 pipeline? 可以,但必須把 DerivedData 與製品目錄分卷或嚴格配額,並在八成前完成升 2TB 或節點拆分,否則 擴容水位會與 Nomad 重試風暴疊加。
為 Nomad 並聯叢集補齊 Mac mini M4 節點
選擇與 batch 區位一致的地理與儲存 tier,讓 constraint、建置鎖與 rsync 腿長落在同一張運維圖上;無需登入即可查看價格與節點配置。