MongoDB的插入操作变得非常慢

时间:2013-11-30 03:20:45

标签: mongodb pymongo

客户是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
}

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

希望这可以说明你的情况。

答案 2 :(得分:0)

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

首先,您需要确定哪个是您的瓶颈(CPU,内存和磁盘IO)。我使用几个unix工具(如top,iotop等)来检测瓶颈。在我的情况下,我发现插入速度滞后于IO速度,因为mongod经常占用99%的io。 (注意:我原来的db使用了mmapv1存储引擎)。

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

然而,我仍然不确定为什么mofod与mmapv1在文档大小达到一定程度后突然耗尽了IO用法。