内存相关错误#
n8n 不限制每个节点可以获取和处理的数据量。虽然这为您提供了自由,但当工作流执行需要的内存超过可用内存时,可能会导致错误。本页解释了如何识别和避免这些错误。
识别内存不足情况#
n8n 提供错误消息,在某些内存不足情况下警告您。例如,诸如 执行在此节点停止(n8n 在执行时可能内存不足) 的消息。
包含 运行工作流时出现问题、连接丢失 或 503 服务暂时不可用 的错误消息表明 n8n 实例已变得不可用。
在自托管 n8n 时,您还可能在服务器日志中看到诸如 分配失败 - JavaScript 堆内存不足 的错误消息。
在 n8n Cloud 上,或使用 n8n 的 Docker 镜像时,n8n 在遇到此类问题时会自动重启。但是,使用 npm 运行 n8n 时,您可能需要手动重启它。
典型原因#
当工作流执行需要的内存超过 n8n 实例可用内存时,会出现此类问题。增加工作流执行内存使用量的因素包括:
- JSON 数据的数量。
- 二进制数据的大小。
- 工作流中的节点数量。
- 某些节点是内存密集型的:Code 节点和较旧的 Function 节点可能显著增加内存消耗。
- 手动或自动工作流执行:手动执行会增加内存消耗,因为 n8n 为前端制作数据副本。
- 同时运行的其他工作流。
避免内存不足情况#
遇到内存不足情况时,有两个选择:要么增加 n8n 可用的内存量,要么减少内存消耗。
增加可用内存#
在自托管 n8n 时,增加 n8n 可用的内存量意味着为您的 n8n 实例提供更多内存。这可能会产生托管提供商的额外费用。
在 n8n cloud 上,您需要升级到更大的计划。
减少内存消耗#
这种方法更复杂,意味着重新构建导致问题的工作流。本节提供一些关于如何减少内存消耗的指导。并非所有建议都适用于所有工作流。
- 将处理的数据分割成更小的块。例如,不要每次执行获取 10,000 行,而是每次执行处理 200 行。
- 尽可能避免使用代码节点。
- 处理大量数据时避免手动执行。
- 将工作流分割成子工作流,并确保每个子工作流向其父工作流返回有限的数据量。
分割工作流起初可能看起来有悖常理,因为它通常需要添加至少两个节点:循环遍历项目节点将项目分割成更小的批次,以及执行工作流节点来启动子工作流。
但是,只要您的子工作流为每个批次执行繁重的工作,然后只向主工作流返回一小部分结果集,这就会减少内存消耗。这是因为子工作流只在内存中保存当前批次的数据,之后内存再次释放。
增加旧内存#
这适用于自托管 n8n。遇到 JavaScript 堆内存不足 错误时,为 V8 JavaScript 引擎的旧内存部分分配额外内存通常很有用。为此,通过 CLI 或通过 NODE_OPTIONS
环境变量设置适当的 V8 选项 --max-old-space-size=SIZE
。