mongoDB中的插入时间很长

时间:2014-12-10 12:33:30

标签: mongodb python-2.7 pymongo

我们有一个从几个(3)UDP服务器提供的集合,它们获取一个条目并将其放入mongodb。

我已经开始检查mongodb上的个人资料并且见证了一段时间(大部分时间都很好)我得到高(~5000)插入。

在nodejs上的另一个组件的Cronjob中有一些MapReduce操作。

我可以注意到同时有很多(50~)插入操作。

该集合上有2个索引,每隔几秒就删除大部分文档,因此不能超过50个。集合没有上限。

MongoDB版本是2.4.6

这会导致什么? 可以在不同集合上同时运行的MapReduce是什么原因?

   {
        "allUsers": [],
        "client": "127.0.0.1",
        "keyUpdates": 0,
        "lockStats": {
            "timeAcquiringMicros": {
                "r": 0,
                "w": 10
            },
            "timeLockedMicros": {
                "r": 0,
                "w": 45
            }
        },
        "millis": 9527,
        "ninserted": 1,
        "ns": "dbname.hits",
        "numYield": 0,
        "op": "insert",
        "ts": {
            "$date": 1418186296785
        },
        "user": ""
    },
    {
        "allUsers": [],
        "client": "127.0.0.1",
        "keyUpdates": 0,
        "lockStats": {
            "timeAcquiringMicros": {
                "r": 0,
                "w": 8
            },
            "timeLockedMicros": {
                "r": 0,
                "w": 35
            }
        },
        "millis": 9396,
        "ninserted": 1,
        "ns": "dbname.hits",
        "numYield": 0,
        "op": "insert",
        "ts": {
            "$date": 1418186296785
        },
        "user": ""
    },
    {
        "allUsers": [],
        "client": "127.0.0.1",
        "keyUpdates": 0,
        "lockStats": {
            "timeAcquiringMicros": {
                "r": 0,
                "w": 6
            },
            "timeLockedMicros": {
                "r": 0,
                "w": 29
            }
        },
        "millis": 9257,
        "ninserted": 1,
        "ns": "dbname.hits",
        "numYield": 0,
        "op": "insert",
        "ts": {
            "$date": 1418186296785
        },
        "user": ""
    },
    {
        "allUsers": [],
        "client": "127.0.0.1",
        "keyUpdates": 0,
        "lockStats": {
            "timeAcquiringMicros": {
                "r": 0,
                "w": 7
            },
            "timeLockedMicros": {
                "r": 0,
                "w": 65
            }
        },
        "millis": 8768,
        "ninserted": 1,
        "ns": "dbname.hits",
        "numYield": 0,
        "op": "insert",
        "ts": {
            "$date": 1418186296785
        },
        "user": ""
    },
    {
        "allUsers": [],
        "client": "127.0.0.1",
        "keyUpdates": 0,
        "lockStats": {
            "timeAcquiringMicros": {
                "r": 0,
                "w": 22
            },
            "timeLockedMicros": {
                "r": 0,
                "w": 62
            }
        },
        "millis": 8566,
        "ninserted": 1,
        "ns": "dbname.hits",
        "numYield": 0,
        "op": "insert",
        "ts": {
            "$date": 1418186296786
        },
        "user": ""
    },
    ...

更新1:

我想解决的问题是:

我们从一些服务器获得点击以存在几个数据流的匹配,我需要将它们聚合到[begin,end]元组,如果它们之间有MAX_DIFF的差异。 例如:

{name:A, time:0, stream:A_1}
{name:A, time:7, stream:A_1}
{name:A, time:15, stream:A_1}
{name:A, time:26, stream:A_1}

MAX_DIFF= 10

我将汇总到另一个集合:

{name:A, stream:A_1, time_begin:0, time_end:15}
{name:A, stream:A_1, time_begin:26, time_end:26}

更新2: 在对配置文件进行一些检查后,似乎Map Reduce是罪魁祸首,在最后阶段使用它的全局写锁定。 map reduce concurrency MR给整个网站做了一些操作,这需要花费很多时间。

1 个答案:

答案 0 :(得分:2)

这里有很多可能的问题 - 这些是我看到的主要问题:

  1. MongoDB在写入期间锁定整个数据库。如此多的写入数据库将在大多数情况下被锁定。您对写作使用哪种写作问题?

  2. 常量删除。不断删除数据通常是个坏主意。您是否可以重新建模数据以避免不断删除?索引只有50个文档,浪费时间。

  3. 存储。你没有提到你正在使用什么样的存储,但MongoDB真的很喜欢SSd&#39>

  4. 2.6比2.4大改进所以你应该真正考虑升级。

  5. 您没有提到您尝试解决的问题类型,但是如果数据被删除且插入速率相同,那么数据库可能不是最适合您的问题。