MongoDB在块中插入需要不同的时间

时间:2014-08-25 11:48:46

标签: mongodb

我是MongoDB的新手,并开始做一个关于改进巨大日志文件插入MongoDB的时间的POC。我的块大小是恒定的(~2MB),我观察到的是20块,突然之间的1或2块(随机)需要大约20-30%的时间,感谢其他人。

我确实改变了块大小,并且看到这种行为随着块大小的减少而消失。我也做了一个分析,看到一个辅助线程通过ping它检查mongo db服务器状态,并在从服务器接收回来的消息时,消耗了额外的时间。我的猜测是因为并发写锁定。

任何专家都对此提出建议,也欢迎提出建议。

提前致谢。

我一直在使用的代码片段并测量时间:

 DateTime dt3 = DateTime.Now;
                MongoInsertOptions options = new MongoInsertOptions();
                options.WriteConcern = WriteConcern.Unacknowledged;
                options.CheckElementNames = true;
                //var task = InsertBatchAsync<LogEvent>(collection, logEventsChunk.LogEvents);                
                collection.InsertBatch(logEventsChunk.LogEvents, options);

                Console.WriteLine("Chunk Number: " + chunkCount.ToString() + Environment.NewLine 
                    + "Write time for " + logEventsChunk.LogEvents.Count + " logs in MONGODB = " + DateTime.Now.Subtract(dt3).TotalSeconds + "s" + Environment.NewLine);
                mongoDBInsertionTotalTime += DateTime.Now.Subtract(dt3).TotalSeconds;

上面的代码片段为我得到的每一块数据循环。

1 个答案:

答案 0 :(得分:1)

将tcpClient(发送和接收)的缓冲区大小增加到1GB有帮助。它们在MongoDefault.cs下作为公共属性公开。

在分析C#驱动程序(Mongo)时,我发现瓶颈是要复制networkStream。所以我增加了缓冲区并且它有效。

此外,由于我的数据库服务器是本地托管的,我已经摆脱了C#驱动程序中的并发服务器状态回调。