【问题标题】:What those nodeJS options mean这些 nodeJS 选项是什么意思
【发布时间】:2021-08-04 07:14:12
【问题描述】:

我正在从 GCP 租用 96 核、360gb ram linux VM。我的函数正在生成 100.000.000 个组合(项目数组),每个组合都被传递到一个相当繁重的函数中。我正在运行 numberOfCores - 1 workers 将任务分成相等的部分。

实例使用不同的选项值抛出不同的错误,但所有错误的共同点是:JavaScript heap out of memory

我玩过这些:

--max-old-space-size, --max-semi-space-size

第一个选项是最受欢迎的,据我所知,大多数情况下都可以解决问题,但在我的情况下却没有。

我正在尝试研究解决此问题的所有可能选项(因为我不敢相信 96 个内核,而 360gb 内存还不够),我发现了一些:

对于工人:

  • maxOldGenerationSizeMb
  • maxYoungGenerationSizeMb
  • codeRangeSizeMb
  • stackSizeMb

对于节点(不包括已经提到的):

  • --v8-pool-size
  • --huge-max-old-generation-size
  • --stack-trace-limit

它们的文档记录不是很好,我想了解每个解决我的内存不足问题的意义,并将它们设置为最大限度地利用硬件资源而不导致崩溃。

【问题讨论】:

  • 你真的需要一次在 RAM 中的所有组合吗?通常我一次只需要评估一个组合。那行得通吗?如果是这样,您可以使用生成器或基于回调的代码一次评估一个组合。如果您有兴趣,我有一些排列代码我写了一些时间来测试这个想法
  • 我目前的实现是计算所有组合(以获得总长度),获取可用的核心数量 - 1,从中计算每个核心要处理的元素数量,拆分大数组成块(并同时拼接),然后用他们自己的块启动工人。该错误通常在第 10-15 个 worker 启动后抛出。我想看看你的想法,也许我的想法是错误的。
  • 我想你是通过递归函数生成组合?
  • @GergőHorváth - 你运气好吗?我有一台 256gb 的服务器,我的主节点进程及其 worker_threads 遇到了相同的 out of memory 问题

标签: node.js


【解决方案1】:

对于它的价值,我在具有 256gb 内存的 linux 机器上遇到了同样的 OOM 错误问题,并且没有对这些值进行任何调整对我有用。基于this discussion,最终为我解决worker_thread OOM 错误的是调整这些限制:

sysctl -w kernel.threads-max=4194303
sysctl -w vm.max_map_count=8388606
sysctl -w kernel.pid_max=4194303

并在重新启动后保留它们:

vi /etc/sysctl.conf
kernel.threads-max = 4194303
vm.max_map_count = 8388606
kernel.pid_max = 4194303

在应用了这些后停止并重新启动主节点进程后,我没有看到 OOM。

我发现的另一件有趣的事情 - 您在启动节点时设置的 max-old-space-size 参数是 inherited by all the worker_threads 并且您不需要使用 resourceLimits. maxOldGenerationSizeMb 发出相同的数量 - 所以我认为您不需要启动大量的“主”脚本,然后将 worker_threads 设置为较小的数量;我认为您可以使用您打算提供给worker_thread的相同值启动主脚本

最后,FWIW,我无法使用此配置将最大线程数设置为超过 CPU 核心数。我正在使用threadsjs 和一个线程池,但没有直接生成工人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 2010-12-21
    • 2013-08-20
    • 2014-12-24
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多