MongoDB慢写会导致套接字超时异常

时间:2011-11-11 11:59:14

标签: c# performance mongodb mongodb-.net-driver

我遇到了MongoDB的性能问题。

继续:

  • MongoDB 2.0.1
  • Windows 2008 R2
  • 12 GB RAM
  • 2 TB HDD(5400 rpm)

我编写了一个删除和插入记录异步的守护进程。每小时大部分收集都被清除,他们将获得新的插入数据(10-12百万个删除和10-12百万个插入)。守护进程在插入数据时使用~60-80的CPU(由于计算了100多万个背包问题)。当我启动守护进程时,它可以完成大约1-2分钟的工作,直到它由于套接字超时而崩溃(将数据写入MongoDB服务器)。

当我查看日志时,我发现删除集合中的数据大约需要30秒。它似乎与CPU负载和内存使用有关..因为当我在另一台PC上运行守护进程时,一切都很顺利。

是否可以进行任何优化,或者我只是使用单独的PC运行守护程序(或选择其他文档存储)?

更新11/13/2011 18:44 GMT + 1

还有问题..我对我的守护进行了一些修改。我减少了并发写入次数。但是,当内存变满(11.8GB的12GB)并且接收到更多负载(将数据加载到前端)时,守护程序仍会崩溃。由于MongoDB的长插入/删除(30秒),它崩溃了。 守护程序的崩溃是因为MongoDB响应缓慢(套接字超时异常)。当然应该有try / catch语句来捕获这些异常,但它不应该首先发生。我正在寻找解决这个问题的解决方案,而不是解决它。

  • 总存储空间大小为:8,1 GB
  • 索引大小为:2,1 GB

我想问题在于工作集+索引太大而无法存储在内存中而且MongoDB需要访问HDD(速度慢5400转)。但是为什么这会出现问题呢?是否存在其他策略来存储集合(例如,在单独的文件中而不是大块的2GB)。如果一个Relational数据库可以在一个可接受的时间内从磁盘读/写数据,为什么MongoDB不能?

更新11/15/2011 00:04 GMT + 1

日志文件以说明问题:

00:02:46 [conn3] insert bargains.auction-history-eu-bloodhoof-horde 421ms
00:02:47 [conn6] insert bargains.auction-history-eu-blackhand-horde 1357ms
00:02:48 [conn3] insert bargains.auction-history-eu-bloodhoof-alliance 577ms
00:02:48 [conn6] insert bargains.auction-history-eu-blackhand-alliance 499ms
00:02:49 [conn4] remove bargains.crafts-eu-agamaggan-horde 34881ms
00:02:49 [conn5] remove bargains.crafts-eu-aggramar-horde 3135ms
00:02:49 [conn5] insert bargains.crafts-eu-aggramar-horde 234ms
00:02:50 [conn2] remove bargains.auctions-eu-aerie-peak-horde 36223ms
00:02:52 [conn5] remove bargains.auctions-eu-aegwynn-horde 1700ms

更新11/18/2011 10:41 GMT + 1 在mongodb用户组中发布此问题后,我们发现未发出“drop”。丢弃比完全删除所有记录快得多。

我正在使用官方的mongodb-csharp-driver。我发出了这个命令collection.Drop();。但是它不起作用,所以暂时使用它:


public void Clear() 
{ 
    if (collection.Exists()) 
        { 
            var command = new CommandDocument { 
            { "drop", collectionName }
                };

                collection.Database.RunCommand(command); 
    } 
} 

守护程序现在非常稳定,但我必须找出collection.Drop()方法无法正常工作的原因,因为驱动程序也使用本机drop命令。

5 个答案:

答案 0 :(得分:3)

可能会进行一些优化:

  1. 确保您的mongodb未在verbose模式下运行,这将确保最少的日志记录,从而最大限度地减少I / O.否则,它会将每个操作写入日志文件。

  2. 如果可能,应用程序逻辑将插入转换为批量插入。大多数mongodb驱动程序都支持Bulk插入。 http://www.mongodb.org/display/DOCS/Inserting#Inserting-Bulkinserts

  3. 尝试批量删除,而不是每个记录删除一次操作。 例如。收集1000个文档的“_id”,然后使用$in运算符触发删除查询。 您对mongoDb的查询次数将减少1000次。

  4. 如果要删除/插入同一文档以刷新数据,请尝试考虑更新。

  5. 你在跑什么样的守护神?如果您可以分享更多信息,也可以对其进行优化以减少CPU负载。

答案 1 :(得分:2)

它可能完全不相关,但2.0.0中存在与CPU消耗有关的问题。 after upgrade to 2.0.0 mongo starts consuming all cpu resources locking the system, complains of memory leak

答案 2 :(得分:0)

除非我误解了,否则您的应用程序会崩溃,而不是mongod。您是否尝试从图片中删除MongoDB并将写入替换为可能写入文件系统的MongoDB?

这可能会为您的应用程序中与MongoDB无关的其他问题带来光明。

答案 3 :(得分:0)

我在Windows Server 2008 R2上遇到过与SQL Server 2008类似的情况。对我来说,它最终成为网卡。 NIC设置为自动检测连接速度,这导致偶尔丢失/丢失数据包,这导致套接字超时问题。要测试,您可以从本地工作站ping该框,然后开始加载Windows 2008 R2服务器。如果最终出现此问题,您将开始在ping命令上看到超时

ping yourWin2008R2Server -n 1000

解决方案最终是明确设置NIC连接速度 管理计算机>设备管理器>网络适​​配器>属性,然后取决于你将有一个链接速度设置选项卡或必须进入另一个菜单。您需要将其设置为与其连接的网络的速度。在我的DEV环境中,它最终是100Mbps半双工。

如你所知,这些类型的问题可能是追踪的真正痛苦!

最好把它弄清楚。

答案 4 :(得分:0)

守护程序现在稳定,在mongodb用户组中发布此问题后,我们发现没有发出“drop”。丢弃比完全删除所有记录快得多。