MongoDB写入速度慢导致套接字超时异常

本文关键字:套接字 超时 异常 速度慢 MongoDB | 更新日期: 2023-09-27 18:14:05

我在MongoDB中遇到了性能问题。

运行于:

  • MongoDB 2.0.1
  • Windows 2008 R2
  • 12 GB内存
  • 2 TB HDD(5400 rpm(

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

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

是否有任何优化可能,或者我只需要使用一台单独的PC来运行守护程序(或选择另一个文档存储(?

更新时间:2011年11月13日18:44 GMT+1

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

  • 总存储大小为:8.1 GB
  • 索引大小为:2.1 GB

我想问题在于工作集+索引太大,无法存储在内存中,MongoDB需要访问HDD(速度慢5400 rpm(。。然而,为什么这会成为一个问题?难道没有其他策略来存储集合吗(例如,在单独的文件中而不是2GB的大块中(。如果关系数据库可以在可接受的时间内从磁盘读取/写入数据,为什么MongoDB不能呢?

更新日期:2011年11月15日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驱动程序。我发出了这个命令collection.Drop();。然而,它没有起作用,所以暂时我使用了这个:


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

守护进程现在相当稳定,但我必须找出为什么collection.Drop()方法不能正常工作,因为驱动程序也使用本机drop命令。

MongoDB写入速度慢导致套接字超时异常

可能会进行一些优化:

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

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

  3. 请尝试批量删除,而不是对每条记录执行一次删除操作。例如,收集1000个文档的"_id",然后使用$in运算符启动remove查询。对mongoDb的查询将减少1000倍。

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

  5. 你在运行什么样的deamon?如果你能分享更多关于这方面的信息,那么也可以对其进行优化,以减少CPU负载。

这可能完全无关,但2.0.0中存在一个与CPU消耗有关的问题。在升级到2.0.0之后,mongo开始消耗所有的cpu资源来锁定系统,抱怨内存泄漏

除非我误解了,否则你的应用程序正在崩溃,而不是mongod。您是否尝试过从图片中删除MongoDB,并用对文件系统的写入来替换对MongoDB的写入?

也许这将揭示应用程序中与MongoDB无关的其他问题。

我在Windows Server 2008 R2上使用SQL Server 2008时遇到过类似的情况。对我来说,它最终变成了网卡。NIC被设置为自动感应连接速度,这会导致偶尔丢弃/丢失数据包,从而导致套接字超时问题。要进行测试,您可以从本地工作站ping该框,然后启动进程以加载Windows 2008 R2服务器。如果最终是这个问题,你会开始在你的ping命令上看到超时

ping yourWin2008R2Server -n 1000

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

正如你所知,这些类型的问题可能真的很难找到!

最好你弄清楚。

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