Elastsearch查询导致NodeJS堆内存不足

时间:2020-10-13 11:21:10

标签: node.js elasticsearch memory-leaks

现在发生了什么?

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

查询一遍又一遍。 NodeJS内存将从20mb开始增加到1024mb。 令人惊讶的是,内存并没有立即达到顶峰。它更像是稳定地在25mb以下(保持约几分钟),然后突然开始增长(25mb,46mb,125mb,350mb ...直到1024mb),最终导致NodeJS内存泄漏。 无论我如何称呼此查询,内存都将继续增长并且完全不会释放。而且这种情况仅发生在远程服务器(在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"
            }
        }
    }
}

返回值是多少?

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

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

2 个答案:

答案 0 :(得分:0)

如果您的直方图间隔确实是3600ms(不应该是3600s?),那么在12周内进行汇总的时间就非常短。 表示0.06分钟。 每天24000次 每周168000 2016000,共12周。 它可以解释

  1. 为什么您的脚本要等待很长时间才能执行任何操作
  2. 为什么在存储桶上循环时内存会爆炸

在您的示例中,您只有2016个存储桶。 我认为这是您两次测试之间的微小差异。

答案 1 :(得分:0)

新更新。问题已解决。项目中的问题在服务器和数据库之间具有。因此导致查询内存的这一层代码无法释放。