内存相关错误#
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=容量值。