資源池容量與併發模型
資源池是「有限 IOPS 與頻寬被多條流水線共享」。未約束併發拉取時,高峰易磁碟佇列堆積、git fetch 與 npm ci 隨機寫打滿,拖垮編譯與測試。請分開計算併發與網路/磁碟併發,後者通常要更保守。
| 池規模/磁碟 | 建議同時「重型拉取」* | Git 網路併發(每節點) | 套件安裝併發策略 |
|---|---|---|---|
| 小池(1–2 台,單 SSD 系統碟) | 2–3 | 2–4 | 序列化 npm ci 或每節點≤2 |
| 中池(3–8 台,系統碟+快取資料夾在同一 SSD) | 3–5 | 3–5 | 分 workspace 目錄+檔案鎖;高峰限流 |
| 大池(快取獨立 NVMe 卷) | 5–8 | 4–6 | 可拉高 registry 併發,仍以 iowait 為準 |
*「重型拉取」指完整 clone、大量 LFS、或一次性下載數 GB 依賴;實際值請以監控校準。
Git/NPM 拉取隊列與鎖
常見衝突:同一工作目錄被並行 git clean/reset,或共用 npm cache 鎖競爭。以資源池層隊列串重型步驟,以鎖保護共享路徑。
- 倉庫級鎖:同一
REPO_SLUG在節點上只允許一個 job 進入「可變更工作目錄」階段;其它 job 進入 FIFO 等待(建議逾時 15–45 分鐘,依倉庫大小調整)。 - 全域拉取閘:以計數器限制同時進行的 clone/大 fetch 數量(預設 3,磁碟吃緊時降到 2)。
- NPM:共享快取時啟用
npm config set prefer-offline true(在快取命中路徑穩定後),並避免多 job 同寫預設 cache;可改為每 job 暫存目錄+結束後 merge,或分使用者 cache 根目錄。
# 範例:以 flock 做倉庫級互斥(路徑請依 CI 調整) flock /var/locks/ci-repo-myapp.lock -c 'git fetch --prune && git checkout -f FETCH_HEAD'
與「單機拉取穩定性」相關的 Git/npm 參數可再對照拉取穩定性 FAQ。
磁碟與快取分區閾值
磁碟 IO常先於 CPU 成為瓶頸。系統、工作區與長生命週期快取宜分掛載,避免清快取連帶塞滿系統碟。下表為水位閾值起點,請依 SLA 微調。
| 監控對象 | 警戒線(建議) | 嚴重線(建議) | 建議動作 |
|---|---|---|---|
| 根分區/系統碟可用空間 | < 18–20% | < 12–15% | 警戒:觸發限流、暫停非關鍵 prewarm;嚴重:中止新 job、清理暫存與舊 artifact |
| 專用快取卷可用空間 | < 25% | < 15% | LRU 清理套件快取、舊 Derived Data、未使用映像 |
| inode 剩餘比例 | < 12% | < 8% | 清 node_modules 暫存、大量小檔建構產物;檢查日誌爆量目錄 |
| 平均磁碟佇列深度/iowait | iowait > 15% 持續 3–5 分鐘 | > 30% 或 latency P95 明顯上升 | 下調併發拉取、暫停 snapshot/備份、檢查 SSD 健康 |
分區策略的細節與目錄規劃可參考遠端 Mac 快取策略(Git/NPM/CI)一文。
弱網逾時與斷點策略
弱網下逾時過短易雪崩、過長則占滿隊列。建議分段逾時+指數退避+上限,並對可冪等的「依賴安裝」允許 job 級重試。
| 項目 | 建議閾值(起點) | 說明 |
|---|---|---|
| TCP/HTTP connect | 15–30 秒 | 跨境可採 30s;內網鏡像可 5–10s |
| 單次低速逾時(Git lowSpeed) | lowSpeedLimit 500–1000 B/s;lowSpeedTime 60–120s | 避免「假連線」拖死 worker |
| npm fetch 逾時 | fetch-timeout 120000–300000 ms | 大倉或首次冷快取可再拉高 |
| 重試退避(客戶端) | 初次 2–5s,倍率 2,上限 60–120s,5–8 次 | 加隨機抖動 0–20% 避免雷群 |
| CI job 級重試 | 間隔 30s 起,上限 3–5 分鐘,最多 2–3 次 | 僅用於可冪等步驟;失敗後應輸出磁碟與網路快照 |
驗收與監控指標
上線前跑壓力劇本:多流水線同時冷啟+依賴安裝,驗證水位與隊列是否按預期觸發。日常監控:空間/inode、iowait、重試率、隊列等待 P95。
- SLA:重型拉取隊列等待 P95 建議 < 10–15 分鐘(視倉庫調整)。
- 穩定性:網路/磁碟逾時失敗占比宜低於團隊約定(常見 < 1–2%)。
- 可觀測:限流與清理須打標日誌,便於回調閾值。
常見問題 FAQ
有空間仍報錯? 查 inode、是否寫錯分區,以及快照/備份是否搶 IO。
隊列太長? 先查快取命中與鏡像,勿盲目加併發。
Derived Data 與 npm cache 同卷? 可,但子目錄與清理策略要分開,勿與日誌/artifact 混放易滿路徑。
分場景落地步驟
小團隊(3–5 條流水線共享 1–2 台遠端 Mac)
① 設定全域重型拉取≤3。② 根分區警戒 20%。③ Git 併發 2–4,npm ci 序列化或≤2。④ 每週自動清理快取與暫存。
高峰 monorepo/多產品線
① 倉庫級 flock/互斥隊列必上。② 快取獨立卷+LRU。③ 磁碟警戒與 iowait 聯動限流。④ 對 registry 與 Git 啟用鏡像或內網代理。
跨境弱網
① 採上文弱網逾時表。② SSH ControlPersist 與 Git 低速偵測必開。③ job 級 2–3 次可冪等重試。④ 失敗樣本自動附 df -h、df -i 與網路錯誤摘要。
小結與購買引導
穩定性重點是併發拉取與磁碟 IO可被限流與分區,而非單次拉取極速。將隊列、鎖、水位、逾時重試表列化並接入監控,高峰才扛得住。若要專用 Apple Silicon 承載上述策略,可免登入看定價、購買頁選套餐,說明中心查連線建議;延伸閱讀技術部落格。