AI Agent + Code 節點在 Cloud Starter 上執行 ~1-2MB 二進制檔案時 OOM 當機——非確定性當機點,自託管環境零當機

摘要

我在 n8n Cloud Starter 上遇到了可重現的 OOM 當機問題,即使負載很小(約 1-2 MB 的二進位檔案)也會發生。當機點在不同執行中在程式碼節點和 AI Agent 之間波動,這強烈暗示是共享工作執行緒資源波動,而不是使用者程式碼的錯誤。

相同的工作流程 JSON 在自託管環境(Docker,8 GB 主機)上運行完美 — 30+ 次執行,零當機。

環境

  • 方案:Cloud Starter
  • 例項:verma-digital.app.n8n.cloud
  • n8n 版本:2.20.7 (Cloud)
  • 節點:@n8n/n8n-nodes-langchain.agent v1.8
  • 模型:gpt-4.1-mini

可重現的測試 — 最小化 8 節點工作流程

Manual Trigger
  → Code "Prepare Test Data"
      (via helpers.httpRequest({encoding:'arraybuffer'}) 逐個擷取 URL
       + helpers.prepareBinaryData,每個檔案發出 1 個項目,包含二進位資料)
  → Switch by MIME (PDF / Image / Fallback)
  → Extract from PDF (僅 PDF 分支)  → Merge (附加,3 個輸入)
  → Code "Aggregate"
      (將項目收集到單一輸出:json.text + binary.data_0,
       data_1, ... for AI Agent)
  → AI Agent (passthroughBinaryImages: true)
  → OpenAI Chat Model

無 Postgres 記憶體,無工具,無儲存子工作流程。在仍能重現問題的前提下,這已是最小化的。

我很樂意分享完整的工作流程 JSON。

測試結果

輸入 總二進位大小 結果
2 個小圖示 (webp) 約 40 KB :white_check_mark: 總是成功
2 個小型 PDF (176 + 63 KB) 約 240 KB :white_check_mark: 總是成功
1 個 PDF (2.6 MB,5 頁) 約 2.6 MB :cross_mark: 當機
2 張影像 (1.56 MB + 810 KB webp) 約 2.4 MB :cross_mark: 當機

臨界點應在約 240 KB 至約 2.4 MB 的單次執行總二進位大小之間。即使只有一個 2.6 MB 的二進位檔案(僅一個 helpers.httpRequest 呼叫),當機也會發生,所以這不是累積性的多重擷取洩漏。

有趣的部分 — 非確定性當機點

相同的輸入,相同的工作流程,相同的執行路徑:

  • 執行 1:在程式碼節點 Prepare Test Data 當機(在 helpers.httpRequest / prepareBinaryData 期間)
  • 執行 2:在 AI Agent 節點當機(在 passthroughBinaryImages base64 處理期間)
  • 執行 3:再次在程式碼節點當機
  • (等等)

兩種當機模式都產生相同的 UI 錯誤:

執行在此節點停止
在執行此程式碼期間,n8n 可能耗盡了記憶體。

展開「其他資訊」僅顯示 n8n 版本 + 時間戳。沒有可見的堆疊追蹤。

如果這是使用者程式碼的錯誤,當機在每次執行時都會在同一節點發生。事實上,在相同輸入下當機點不同,這強烈暗示共享工作執行緒資源壓力。

控制測試 — 自託管環境運行良好

我將相同的工作流程 JSON 匯入到自託管 n8n(Docker,n8n 2.20.7,8 GB 主機),使用相同的外部服務(Supabase、OpenAI)。

結果:在上述所有失敗案例中執行了 30+ 次 — 零當機。包括一個 4.7 MB PDF + 2 個大型影像同時運行。

這將原因隔離到雲基礎設施,而不是工作流程或我的程式碼。

問題

  1. 有其他人在 Cloud Starter 上遇到過這種情況嗎?特別是在使用二進位擷取 + AI Agent passthroughBinaryImages 的工作流程中,出現 sub-MB 到 low-MB 負載的間歇性 OOM?

  2. Starter 上是否有未記錄的每次執行記憶體預算,低於公告的 1 GB 工作執行緒記憶體?觀察到的約 2 MB 二進位當機相比之下小了三個數量級。

  3. helpers.httpRequest({encoding:'arraybuffer'})prepareBinaryData 是否有超過緩衝區大小的已知記憶體開銷?

  4. LangChain Agent v1.8 passthroughBinaryImages 是否有已知問題會在輸入 > 1 MB 時尖峰記憶體?

  5. 升級到 Pro 會在很大程度上改變情況,還是相同的共享基礎設施也會影響 Pro?

我真的很想留在 Cloud 上(我們想避免自託管的維護開銷),但現在 Starter 對我們的使用案例不穩定。

我很樂意提供:

  • 完整的工作流程 JSON
  • 失敗的執行 ID(供 n8n 團隊提取伺服器端日誌)
  • 額外的測試資料點(更小的負載、二分搜尋等)

感謝任何見解!

@sawsew467 你的診斷沒錯 — Starter 有嚴格的單次執行記憶體上限,而你在堆疊二進制 + base64 編碼的影像(passthroughBinaryImages 會增加約 33%)+ Code node 聚合,這些都同時存在記憶體中。自架設搭配 8GB 就有更充足的空間。最快的解決方案(不用升級方案):移除 passthroughBinaryImages 並改為傳遞影像 URL 給 agent — 模型會取回這些影像,你的執行記憶體就保持平穩。通常每次執行有多少張影像?這會決定 URL 傳遞是否可行,或者你需要完全不同的解決方案。

@sawsew467

當機是因為 n8n Cloud Starter 方案的記憶體限制遠低於你的預期——只有 320 MB 的 RAM,而不是 1 GB。當你處理檔案(如 PDF 或影像)時,n8n 不只是使用檔案的實際大小;它會在背景建立多個副本,並將它們轉換為文字格式 (Base64) 供 AI 讀取,這會大幅增加記憶體使用量。因為你的運作環境剛好在這個限制的邊緣,系統會在特定執行時於超過記憶體限制的節點隨機當機。

由於你的工作流程在擁有更多 RAM 的自託管伺服器上運作完美無缺,你的程式碼不是問題所在——雲端「容器」對於這項任務來說實在太小了。要修正這個問題,最有效的解決方案是升級到 Pro 方案,該方案提供更多的記憶體(高達 1.2 GB)。或者,你可以不直接上傳檔案到 AI Agent,而是提供檔案的網路連結給 AI,這樣可以完全繞過費資源的轉換流程。