【问题标题】:Insert operation became very slow for MongoDBMongoDB 的插入操作变得非常慢
【发布时间】:2013-12-16 06:16:24
【问题描述】:

客户端是pymongo。

该程序已经运行了一个星期。之前插入数据确实很快:大约1000万/30分钟。

但是今天我发现插入操作变得非常非常慢。

目前收货记录约1.2亿条。

> db.goods.count()

123535156

收货指标如下:

db.goods.getIndexes();

[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "shop.goods",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "item_id" : 1,
                        "updated_at" : -1
                },
                "unique" : true,
                "ns" : "shop.goods",
                "name" : "item_id_1_updated_at_-1"
        },
        {
                "v" : 1,
                "key" : {
                        "updated_at" : 1
                },
                "ns" : "shop.goods",
                "name" : "updated_at_1"
        },
        {
                "v" : 1,
                "key" : {
                        "item_id" : 1
                },
                "ns" : "shop.goods",
                "name" : "item_id_1"
        }
]

并且有足够的 RAM 和 CPU。

有人告诉我,因为记录太多。但是没有告诉我如何解决这个问题。我对 MongoDB 有点失望。

未来会有更多的数据需要存储(每天大约 5000 万条新记录)。有什么解决办法吗?

在另一台服务器上遇到同样的情况(这次数据少,总共约4000万条),当前插入速度约为每秒5条记录。

> db.products.stats()
{
        "ns" : "c2c.products",
        "count" : 42389635,
        "size" : 554721283200,
        "avgObjSize" : 13086.248164203349,
        "storageSize" : 560415723712,
        "numExtents" : 283,
        "nindexes" : 3,
        "lastExtentSize" : 2146426864,
        "paddingFactor" : 1.0000000000132128,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 4257185968,
        "indexSizes" : {
                "_id_" : 1375325840,
                "product_id_1" : 1687460992,
                "created_at_1" : 1194399136
        },
        "ok" : 1
}

【问题讨论】:

  • 没有足够的信息来了解您的性能问题在哪里;您确实需要收集一些统计信息,并且理想情况下可以通过MongoDB Management service (MMS) 之类的工具获得一些监控历史记录。根据您在描述中的统计数据,您的产品数据库目前约为 520Gb(并且还在增长)。我们不知道您的工作集大小或服务器配置。您应该查看诸如页面错误、内存使用和 I/O 使用等指标,以查看您是否超出了可用资源或找到更具体的痛点。
  • 您找到解决方案/解释了吗?我目前正在调试一个类似的问题,即在长时间运行的过程中插入速度起初非常快,但随着时间的推移会显着减慢。当我重新启动该过程时,它们又很快了。

标签: mongodb pymongo


【解决方案1】:

我不知道这是否是您的问题,但请记住,MongoDB 必须为每个插入更新索引。因此,如果您有许多索引和许多文档,性能可能会低于预期。

也许,您可以使用分片加快插入操作。你没有在你的问题中提到它,所以我猜你没有使用它。

无论如何,您能提供更多信息吗?您可以使用 db.goods.stats()、db.ServerStatus 或 any of theese other methods 来收集有关数据库性能的信息。

【讨论】:

  • 谢谢。已粘贴 stats() 结果。
【解决方案2】:

另一个可能的问题是 IO。根据您的场景,Mongo 可能正忙于尝试为给定的命名空间(即 DB)增长或分配存储文件以用于后续插入语句。如果您的测试模式已经添加记录/删除记录/添加记录/删除记录,您可能会重复使用现有的分配空间。如果您的应用现在运行时间比以前更长,您可能会遇到我描述的情况。

希望这对您的情况有所帮助。

【讨论】:

    【解决方案3】:

    我有一个非常相似的问题。

    首先,您需要确定哪个是您的瓶颈(CPU、内存和磁盘 IO)。我使用了几个 unix 工具(例如 top、iotop 等)来检测瓶颈。就我而言,我发现插入速度落后于 IO 速度,因为 mongod 通常占用 99% 的 io 使用率。 (注意:我原来的数据库使用 mmapv1 存储引擎)。

    我的工作是将存储引擎更改为wiredtiger。 (通过 mongodump 将您的原始数据库然后 mongorestore 转换为wiredtiger 格式,或者使用wiredtiger 引擎启动一个新的mongod,然后从其他副本集成员重新同步。)之后我的插入速度恢复正常。

    但是,我仍然不确定为什么带有 mmapv1 的 mongod 在文档大小达到一定程度后会突然耗尽 IO 使用量。

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多