使用 Node JS 堆内存不足的 Elasticsearch 查询

Elastsearch query causing NodeJS heap out of memory

现在怎么样了?

最近我构建了一个 Elasticsearch 查询。主要功能是获取12周前每小时的数据统计。

当query一遍又一遍的get call。 NodeJS 内存将从 20mb 开始增长到 1024mb。 令人惊讶的是,内存并没有立即达到顶峰。它更像是稳定在 25mb 以下(保持大约几分钟),然后突然开始增长,如(25mb、46mb、125mb、350mb。 ..until 1024mb) 最后导致 NodeJS 内存泄漏。 不管我叫不叫这个查询,内存都会一直增长,根本不会释放。而且这种情况只发生在远程服务器上(运行 in docker),在本地 docker env 完全没问题(内存是相同的)。

enter image description here

如何查询?

如下所示。

const query = {
    "size": 0,
    "query": {
        "bool": {
            "must": [
                { terms: { '_id.keyword': array_id } },
                {
                    "range": {
                        "date_created": {
                            "gte": start_timestamp - timestamp_twelve_weeks,
                            "lt": start_timestamp
                        }
                    }
                }
            ]
        }
    },
    "aggs": {
        "shortcode_log": {
            "date_histogram": {
                "field": "date_created",
                "interval": "3600ms"
            }
        }
    }
}

return 值是多少?

如下所示(总查询时间约为 2 秒)。

{
    "aggs_res": {
        "shortcode_log": {
            "buckets": [
                {
                    "key": 1594710000,
                    "doc_count": 2268
                },
                {
                    "key": 1594713600,
                    "doc_count": 3602
                },
                {//.....total item count 2016
            ]
        }
    }
}

如果你的直方图间隔真的是3600ms(应该不是3600s吧?),12周的聚合时间真的很短。 这意味着0.06分钟。 每天 24000 个周期 每周168000 2016000 12 周。 可以解释

  1. 为什么你的脚本在做任何事情之前要等待很长时间
  2. 为什么当你尝试在桶上循环时你的内存爆炸

在您的示例中,您只有 2016 个存储桶。 我认为他们的 2 个测试之间的差异很小。

新更新。问题解决了。项目中的问题有服务器和数据库之间的层。所以造成查询内存无法释放的这一层代码