Cloudflare Workers Error 1102 怎麼查?先分 CPU 與記憶體
Cloudflare Workers 出現 Error 1102 時,不要先假設是 CPU 不夠,也不要看到失敗就立刻升級方案。Cloudflare 將這個錯誤定義為 Worker 超過 runtime resource limits,主要要分成 CPU time 和 isolate memory 兩條路徑:前者常見於迴圈、JSON parsing 或 SSR 轉換,後者常見於把大型 body、JSON 或陣列整批留在記憶體。
直接答案是:先在 Workers Logs 保留發生錯誤的 route、部署版本、輸入大小與 resource 資訊,再用小/大輸入和停用昂貴步驟做對照。如果 CPU 跟同步運算一起成長,就做 CPU profile、減少計算或拆出非同步工作;如果記憶體跟 payload 或累積狀態一起成長,就限制輸入、改用串流並避免重複 buffering。只有確認是可接受的 CPU-bound workload,才考慮調整方案的 CPU 設定。
先分清楚 CPU time 和記憶體
| 線索 | CPU time 路徑 | 記憶體路徑 |
|---|---|---|
| 常見程式形狀 | 大型迴圈、重複 JSON parse/stringify、正規表示式、SSR 或文件轉換 | arrayBuffer()、text()、大型 JSON、無上限陣列、buffered response |
| 優先觀察 | invocation CPU time、route timing、CPU profile | body 大小、物件生命週期、global state、重複請求 |
| 第一個修正 | 減少同步工作、快取、分批或移到 Queue/Workflow | 限制輸入、使用 stream、提早釋放大型資料 |
| 方案調整 | 可能提高可用 CPU time,但不能修復無窮迴圈 | 不會替你設計安全的記憶體使用方式 |
Cloudflare 的 Workers limits 文件目前列出每個 isolate 128 MB 的記憶體限制;CPU limit 則依方案與設定而異。這些是平台條件,不應硬編碼成應用程式的唯一安全邊界;部署前仍要重新查看官方 limits 頁面與目前方案設定。
從回報 1102 的 invocation 開始
先把同一次失敗的資訊保存下來:
- request path、HTTP method、部署 version 或 script name;
- 發生時間、status、輸入大小和是否為特定 tenant/使用者;
- Workers Logs 顯示的 CPU、exception 或 resource 欄位;
- 失敗前是否經過 JSON parse、影像/文件轉換、SSR 或多次 subrequest。
接著建立一個最小的輸入矩陣,而不是只重送原本那個 production request:
| 測試 | 要回答的問題 |
|---|---|
| 小 payload | 正常執行時的 CPU 和記憶體基線是什麼? |
| 接近失敗大小的 payload | 失敗是否跟輸入大小一起移動? |
| 關閉昂貴轉換 | 哪一段同步程式最可能是 CPU 熱點? |
| 連續多次請求 | 記憶體是否隨 invocation 累積,還是只在單次請求暴增? |
| 相同輸入、不同部署版本 | 問題是否由某次 bundle 或程式變更引入? |
Cloudflare 建議用本機 DevTools CPU profile 找 CPU-heavy code,也可用記憶體 profile 觀察配置與保留物件。量測時要把 parsing、transformation、serialization 分開記錄;只量整個 fetch() 的總時間,通常看不出是哪一段超過限制。
CPU 路徑:減少同步工作
如果 invocation log 顯示 CPU 隨輸入或某個功能一起上升,先檢查程式在網路呼叫前後做了什麼。fetch() 的 network wait 不等於 CPU time;真正會消耗 CPU 的是呼叫前後的迴圈、解析、轉換和序列化。
優先順序可以是:
- 避免同一份資料重複 parse、normalize 或 stringify。
- 資料形狀允許時,用 indexed lookup 取代每筆都掃完整陣列。
- 大型集合拆成有上限的 batch,不要在一個同步迴圈中處理全部資料。
- 穩定且可重用的計算結果放入合適的 cache,但先確認失效和一致性策略。
- 單一 request 不應承擔長時間工作時,改用 Queue、Workflow 或另一個執行邊界。
如果工作本來就是 CPU-bound,且仍符合單一 request 的產品需求,可以評估 paid plan 的 CPU-time 設定。調高上限後要用同一組輸入重新測試;方案變更不能替無上限迴圈、過大的同步轉換或應該非同步化的工作背書。
記憶體路徑:先抓 buffering
最容易造成 isolate memory 壓力的程式,通常看起來很直白:把 request body 讀成完整字串或 ArrayBuffer,再建立一份大型 JSON object,最後又同時保留轉換後結果。若輸入大小不受控,這幾份資料可能在同一時間存在。
下面是應用程式層的簡單輸入護欄;10 MiB 只是示例政策,不是 Cloudflare 的平台上限:
const MAX_BYTES = 10 * 1024 * 1024; // application policy, not a platform limitconst contentLength = Number(request.headers.get('content-length') || 0);
if (contentLength > MAX_BYTES) { return new Response('Payload too large', { status: 413 });}
// For an unknown content length, enforce the same limit while reading request.body.Content-Length 不一定存在,也不應被當成唯一防線。未知大小的 body 要在讀取 stream 時累計 bytes,超過應用程式政策就停止;格式允許時使用 ReadableStream 或 TransformStream,避免同時保存完整輸入和完整輸出。也要檢查 global scope 是否意外保留大型陣列或跨 request 累積的快取。
若 request 在 Worker 執行前就因 edge、zone、API 或 origin 的 request-size limit 被拒絕,那是 413 路徑,不是 1102 記憶體錯誤。相反地,Worker 已被呼叫並在處理資料時超過 runtime resource limit,才應沿著 1102 的 CPU/memory 路徑排查。部署前的 startup 問題則是另一個範圍,可參考 Wrangler check startup 的 bundle 與全域初始化排查。
用邊界矩陣驗證修正
修正後不要只看一次成功 response。至少保留以下證據:
| 測試情境 | 應保存的證據 |
|---|---|
| 小輸入 | status、baseline CPU、記憶體觀察與 latency |
| 大輸入 | Worker 是否被呼叫、失敗 threshold 是否移動、response status |
| 停用昂貴轉換 | CPU 或記憶體下降幅度,確認是否隔離到熱點 |
| 連續請求 | 是否有跨 invocation 成長、global state 是否膨脹 |
| 新的 paid CPU 設定 | 實際 configured limit 與相同 workload 的結果 |
| 正式部署後 | 相同 route/version 的 Workers Logs、tail latency 和 1102 次數 |
如果改完後 1102 次數下降,這是有用的訊號,但仍要檢查下一個更大 payload、錯誤回應是否可預期,以及 log 是否能保留下一次定位所需的 resource 資訊。不要只把成功率改善解讀成「記憶體問題已永久消失」。
判斷 Error 1102 的核心順序很簡單:先分類,再量測,最後才改程式或方案。CPU 問題要減少同步工作、分批或拆出執行邊界;記憶體問題要限制資料量、串流處理並縮短大型物件的生命週期。Workers Logs 加上一組可重現的輸入邊界,才足以支持下一步決策。
常見問題
Q: fetch() 等待時間會算進 Worker CPU limit 嗎?
A: 網路等待本身不是 CPU time;但 fetch() 前後的 JSON parse、迴圈、轉換和序列化仍會消耗 CPU。應優化同步程式,不要只看 subrequest 數量或總 request duration。
Q: 升級到 paid Workers plan 就不會再有 Error 1102 嗎?
A: 不會。paid plan 可能提供較高或可設定的 CPU time,但 1102 也可能是 isolate memory 超限。方案變更不能取代限制輸入、減少 buffering 和拆分長時間工作。
Q: Error 1102 和 413 request body error 是同一件事嗎?
A: 不是。413 可能在 Worker 執行前由 edge、zone、API 或 origin 的大小限制回傳;1102 是 Worker runtime 處理時超過 CPU 或記憶體限制。先確認 Worker 是否實際被呼叫,再選排查路徑。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。