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