现在发生了什么?
最近我构建了一个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
]
}
}
}
2条答案
按热度按时间zpf6vheq1#
新的更新。问题解决了。项目中的问题在服务器和数据库之间有一个层。所以导致查询内存无法释放的这层代码。
xesrikrc2#
如果你的直方图间隔真的是3600ms(不应该是3600s?),那么在12周内进行聚合的时间非常短。意思是0.06分钟。每天24000次,每周168000次,12周2016000次。它可以解释
为什么你的剧本要等很长时间才做任何事
为什么当你试图在桶上循环时你的记忆会爆炸
在您的示例中,只有2016个桶返回。我认为你的两次测试之间的差别很小。