【发布时间】:2015-02-17 02:34:15
【问题描述】:
我们遇到了长时间运行(几分钟)聚合查询的问题。
收藏:
我们收集了 2.5 亿个文档,每个文档大约有 20 个字段, 集合的总大小为 110GB。
我们对“our_id”和 dtKey 字段有索引。
硬件:
记忆:24GB RAM(6 * 4GB DIMM 1333 Mhz)
磁盘:Lvm 11TB 由 4 个 3TB 磁盘构建而成:
-
600MB/s 最大瞬时数据传输。
-
7200 RPM 主轴。平均延迟 = 4.16ms
-
RAID 0
CPU:
2* E5-2420 0 @ 1.90GHz 总共 12 个内核,24 个线程。 戴尔 R420。
问题: 我们正在尝试对以下内容进行聚合查询:
db.our_collection.aggregate(
[
{
"$match":
{
"$and":
[
{"dtKey":{"$gte":20140916}},
{"dtKey":{"$lt":20141217}},
{"our_id":"111111111"}
]
}
},
{
"$project":
{
"field1":1,
"date":1
}
},
{
"$group":
{
"_id":
{
"day":{"$dayOfYear":"$date"},
"year":{"$year":"$date"}
},
"field1":{"$sum":"$field1"}
}
}
]
);
这个查询需要几分钟才能运行,当它运行时我们可以看到以下内容:
- Mongo 当前操作产生超过 300K 次
- 在 iostat 上,我们看到 ~100% 的磁盘利用率
这个查询完成后,它似乎在缓存中,可以在瞬间再次完成,
在为 3 – 4 个用户运行后,第一个似乎已经从缓存中换出,查询又需要很长时间。
我们测试了匹配部分的计数,发现我们有 50K 文档的用户以及 500K 文档的用户,
我们试图只得到匹配的部分:
db.pub_stats.aggregate(
[
{
"$match":
{
"$and":
[
{"dtKey":{"$gte":20140916}},
{"dtKey":{"$lt":20141217}},
{" our_id ":"112162107"}
]
}
}
]
);
而且查询似乎占用了大约 300-500M 的内存,
但运行完整查询后,似乎占用了 3.5G 内存。
问题:
- 为什么聚合的流水线需要这么多内存?
- 我们如何提高性能,使其在 HTTP 请求的合理时间内运行?
【问题讨论】:
标签: mongodb mongodb-query