【问题标题】:Capped Collection Performance Issues上限收集性能问题
【发布时间】:2013-01-18 04:44:52
【问题描述】:

我正在做一些测试,看看我可以从 Mongodb 获得什么样的吞吐量。文档说上限集合是最快的选择。但我经常发现我可以更快地写入普通集合。根据具体的测试,我通常可以通过正常收集获得两倍的吞吐量。

我错过了什么吗?我该如何解决这个问题?

我有一个非常简单的 C++ 程序,它可以尽可能快地将大约 64,000 个文档写入一个集合。我记录了总时间,以及我等待数据库的时间。如果我只更改集合名称,我可以看到上限集合和普通集合之间的明显区别。

> use tutorial
switched to db tutorial
> db.system.namespaces.find()
{ "name" : "tutorial.system.indexes" }
{ "name" : "tutorial.persons.$_id_" }
{ "name" : "tutorial.persons" }
{ "name" : "tutorial.persons.$age_1" }
{ "name" : "tutorial.alerts.$_id_" }
{ "name" : "tutorial.alerts" }
{ "name" : "tutorial.capped.$_id_" }
{ "name" : "tutorial.capped", "options" : { "create" : "capped", "capped" : true, "size" : 100000000 } }
> db.alerts.stats()
{
    "ns" : "tutorial.alerts",
    "count" : 400000,
    "size" : 561088000,
    "avgObjSize" : 1402.72,
    "storageSize" : 629612544,
    "numExtents" : 16,
    "nindexes" : 1,
    "lastExtentSize" : 168730624,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 12991664,
    "indexSizes" : {
        "_id_" : 12991664
    },
    "ok" : 1
}
> db.capped.stats()
{
    "ns" : "tutorial.capped",
    "count" : 62815,
    "size" : 98996440,
    "avgObjSize" : 1576,
    "storageSize" : 100003840,
    "numExtents" : 1,
    "nindexes" : 1,
    "lastExtentSize" : 100003840,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 2044000,
    "indexSizes" : {
        "_id_" : 2044000
    },
    "capped" : true,
    "max" : 2147483647,
    "ok" : 1
}

linux版本:3.4.11-1.fc16.x86_64

mongo 版本:db 版本 v2.2.2,pdfile 版本 4.5

这是一台专用机器,只运行 Mongodb 服务器和我的测试客户端。这台机器在这个测试中被荒谬地压倒了。

【问题讨论】:

  • 您能否提供一个指向您所看到的文档的链接,该链接表明插入上限集合更快?
  • docs.mongodb.org/manual/core/capped-collections "在没有索引的情况下将文档插入上限集合中的速度接近于将日志信息直接写入文件系统的速度。"

标签: mongodb


【解决方案1】:

我看到了问题。我上面引用的网页说“没有索引”的上限集合将提供高性能。但是……

http://docs.mongodb.org/manual/core/indexes/ 说“在 2.2 版之前,上限集合没有 _id 字段。在 2.2 中,所有上限集合都有一个 _id 字段,本地数据库中的除外。”

我创建了另一个版本的测试,它写入本地数据库中的上限集合。果然这个集合没有任何索引,我的吞吐率高很多!

也许http://docs.mongodb.org/manual/core/capped-collections/ 的封顶集合概述应该澄清这一点。

【讨论】:

  • 另外,请注意您应该比较 插入 + 删除旧数据,而不仅仅是 插入 - 这是 capped colleciton 自动执行的操作。
  • 这正是我们所处的位置。我们发现上限集合正在扼杀我们的表现。我们认为这是索引,并被jira.mongodb.org/browse/SERVER-2048 激怒了,但后来注意到我们的无上限集合也有一个 id 索引。但后来我们意识到我们并没有从无上限的集合中删除旧数据。愤怒又回来了。
【解决方案2】:

上限集合保证插入顺序的保留。作为一个 结果,查询不需要索引即可在插入中返回文档 命令。如果没有这种索引开销,它们可以支持更高的 插入吞吐量。

根据上面的定义,如果你没有任何索引插入到有上限的集合中,并不一定比插入到普通集合中更快。因此,如果您没有任何索引,并且没有任何其他理由使用上限集合(例如缓存),那么显示最后 n 个元素是一种我建议您使用常规集合的东西。

上限集合保证插入顺序与 磁盘上的顺序(自然顺序),并通过禁止更新来做到这一点 增加文档大小。 Capped collections 只允许适合的更新 原始文件大小,确保文件不会改变 它在磁盘上的位置。

【讨论】:

  • 如果您没有索引,插入会更快,因为您不必更新该索引。维护插入顺序不会增加额外的开销。您根本无法删除上限集合中的文档或增加其大小,因此文档将始终保持在磁盘上的相同位置。这就是维持秩序的方式。
猜你喜欢
  • 2017-10-29
  • 2018-05-14
  • 2022-09-22
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多