导致nodejs堆内存不足的elastsearch查询

qxgroojn  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(353)

现在发生了什么?
最近我构建了一个elasticsearch查询。主要功能是获取12周前每小时的数据计数。
当查询被反复调用时。nodejs内存将从20mb增长到1024mb。令人惊讶的是,记忆并没有立即到达顶端。它更像是稳定在25mb以下(保持几分钟左右),然后突然开始增长(25mb、46mb、125mb、350mb…直到1024mb),最后导致nodejs内存泄漏。不管我称这个查询与否,内存仍会增长,不会释放。这种情况只发生在远程服务器上(在docker中运行),在本地docker环境完全正常(内存相同)。
在此处输入图像描述
我怎么问?
就像下面一样。

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
            ]
        }
    }
}
zpf6vheq

zpf6vheq1#

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

xesrikrc

xesrikrc2#

如果你的直方图间隔真的是3600ms(不应该是3600s?),那么在12周内进行聚合的时间非常短。意思是0.06分钟。每天24000次,每周168000次,12周2016000次。它可以解释
为什么你的剧本要等很长时间才做任何事
为什么当你试图在桶上循环时你的记忆会爆炸
在您的示例中,只有2016个桶返回。我认为你的两次测试之间的差别很小。

相关问题