内存相关错误#
n8n不限制每个节点可以获取和处理的数据量。虽然这给了您自由,但当工作流执行需要的内存超过可用内存时,可能会导致错误。本页说明如何识别和避免这些错误。
Identifying out of memory situations#
n8n provides error messages that warn you in some out of memory situations. For example, messages such as Execution stopped at this node (n8n may have run out of memory while executing it).
包含工作流运行问题、连接丢失或503服务暂时不可用的错误消息表明n8n实例已不可用。
When self-hosting n8n, you may also see error messages such as Allocation failed - JavaScript heap out of memory in your server logs.
在n8n Cloud上,或使用n8n的Docker镜像时,n8n在遇到此类问题时会自动重启。然而,当使用npm运行n8n时,您可能需要手动重启它。
常见原因#
当工作流执行所需内存超过n8n实例可用内存时,就会出现此类问题。导致工作流执行内存使用量增加的因素包括:
- JSON数据的数量。
- 二进制数据的大小。
- 工作流中的节点数量。
- 某些节点内存消耗较大:Code节点和旧版Function节点会显著增加内存占用。
- 手动或自动工作流执行:手动执行会增加内存消耗,因为n8n会为前端复制一份数据。
- 同时运行的额外工作流。
Avoiding out of memory situations#
When encountering an out of memory situation, there are two options: either increase the amount of memory available to n8n or reduce the memory consumption.
增加可用内存#
当自行托管n8n时,增加n8n可用内存意味着为您的n8n实例配置更多内存。这可能会在您的托管服务提供商处产生额外费用。
在n8n云上您需要升级到更大的套餐计划。
降低内存消耗#
这种方法更为复杂,意味着需要重建导致问题的工作流。本节提供了一些关于如何减少内存消耗的指导原则。并非所有建议都适用于所有工作流。
- 将处理的数据分割成更小的块。例如,每次执行处理200行数据,而不是每次执行获取10,000行。
- 尽可能避免使用代码节点。
- 处理大量数据时避免手动执行。
- 将工作流拆分为子工作流,并确保每个子工作流向其父工作流返回有限的数据量。
最初拆分工作流可能看起来违反直觉,因为它通常需要至少再添加两个节点:Loop Over Items节点用于将项目拆分为更小的批次,以及Execute Workflow节点用于启动子工作流。
然而,只要您的子工作流为每个批次完成繁重的处理任务,然后仅向主工作流返回较小的结果集,这就能降低内存消耗。这是因为子工作流在内存中仅保留当前批次的数据,处理完成后内存即可立即释放。
增加旧记忆#
This applies to self-hosting n8n. When encountering JavaScript heap out of memory errors, it's often useful to allocate additional memory to the old memory section of the V8 JavaScript engine. To do this, set the appropriate V8 option --max-old-space-size=SIZE either through the CLI or through the NODE_OPTIONS environment variable.