跳到主要内容

内存相关错误#

n8n 不会限制每个节点可获取和处理的数据量。虽然这赋予了用户自由度,但当工作流执行所需内存超过可用内存时,可能导致错误。本页将说明如何识别和避免这类错误。

仅适用于自托管 n8n

本文档描述的是自托管 n8n 时的内存相关错误。如需了解 n8n Cloud 的内存限制,请参阅云数据管理

识别内存不足情况#

n8n 会在某些内存不足情况下提供错误提示信息。例如出现**执行在此节点停止(n8n 可能在执行时内存耗尽)**等提示。

包含工作流运行问题连接丢失503 服务暂时不可用的错误信息,表明 n8n 实例已不可用。

自托管 n8n 时,您可能还会在服务器日志中看到分配失败 - JavaScript 堆内存不足等错误信息。

在 n8n Cloud 或使用 n8n Docker 镜像时,n8n 会在遇到此类问题时自动重启。但若通过 npm 运行 n8n,则可能需要手动重启。

典型成因#

当工作流执行所需内存超过 n8n 实例可用内存时,就会出现此类问题。导致工作流执行内存使用量增加的因素包括:

  • JSON 数据
  • 二进制数据大小
  • 工作流中的节点数量
  • 某些节点内存占用较高:代码节点及旧版函数节点会显著增加内存消耗
  • 手动或自动工作流执行:手动执行会增加内存消耗,因为 n8n 需要为前端复制数据
  • 同时运行的其他工作流

避免内存不足情况#

遇到内存不足情况时,有两种解决方案:增加 n8n 可用内存或降低内存消耗。

增加可用内存#

自托管 n8n 时,增加可用内存意味着需要为 n8n 实例配置更多内存,这可能会产生额外的托管服务费用。

在 n8n Cloud 中则需要升级到更大规格的方案。

降低内存消耗#

此方案更复杂,需要重新构建引发问题的工作流。本节提供降低内存消耗的指导原则,并非所有建议都适用于每个工作流:

  • 将处理的数据拆分为更小的批次。例如每次执行处理 200 行数据,而非每次执行获取 10,000 行
  • 尽量避免使用代码节点
  • 处理大量数据时避免手动执行
  • 将工作流拆分为子工作流,并确保每个子工作流向父工作流返回有限的数据量

拆分工作流初看可能违反直觉,因为这通常需要至少增加两个节点:逐项循环节点用于将数据拆分成小批次,执行工作流节点用于启动子工作流。

但只要子工作流负责处理每个批次的重负荷任务,然后仅向主工作流返回少量结果集,就能有效降低内存消耗。这是因为子工作流仅需在内存中保留当前批次的数据,处理完成后即可释放内存。

增加老生代内存#

此方案适用于自托管 n8n。当遇到 JavaScript 堆内存不足 错误时,为 V8 JavaScript 引擎的老生代内存区分配额外内存通常很有效。可通过 CLI 或 NODE_OPTIONS 环境变量设置相应的 V8 选项 --max-old-space-size=容量值