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没有在
verbose
模式下运行,这将确保最少的日志记录,从而确保最少的I/O。否则,它会将每个操作写入日志文件。 -
如果应用程序逻辑可能,请将插入转换为大容量插入。大多数mongodb驱动程序都支持大容量插入。http://www.mongodb.org/display/DOCS/Inserting#Inserting-隔板
-
请尝试批量删除,而不是对每条记录执行一次删除操作。例如,收集1000个文档的"_id",然后使用
$in
运算符启动remove查询。对mongoDb的查询将减少1000倍。 -
若要删除/插入同一文档以刷新数据,请尝试考虑更新。
-
你在运行什么样的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"。删除要比完全删除所有记录快得多。