c# - MongoDB慢写导致socket超时异常

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

我遇到了 MongoDB 的性能问题。

运行时间:

  • MongoDB 2.0.1
  • Windows 2008 R2
  • 12 GB 内存
  • 2 TB 硬盘(5400 rpm)

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

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

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

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

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

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

我想问题在于工作集+索引太大而无法存储在内存中,MongoDB 需要访问 HDD(速度慢 5400 rpm)。但是为什么这会成为问题?没有其他策略来存储集合(例如,在单独的文件中而不是 2GB 的大块)。如果关系数据库可以在可接受的时间内从磁盘读取/写入数据,为什么 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
<b>00:02:49 [conn4] remove bargains.crafts-eu-agamaggan-horde 34881ms</b>
00:02:49 [conn5] remove bargains.crafts-eu-aggramar-horde 3135ms
00:02:49 [conn5] insert bargains.crafts-eu-aggramar-horde 234ms
<b>00:02:50 [conn2] remove bargains.auctions-eu-aerie-peak-horde 36223ms</b>
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() 方法不能正常工作,因为驱动程序也使用 native drop 命令。

最佳答案

一些优化可能是可能的:

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

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

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

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

  5. 您正在运行哪种守护进程?如果您可以分享更多相关信息,也可以对其进行优化以减少 CPU 负载。

关于c# - MongoDB慢写导致socket超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093679/

相关文章:

javascript - Mongoose findByIdAndUpdate 不更新数据

c# - 如何在 WIQL TFS 中知道 ID 是否有父 ID?

c# - 既不使用 + 也不使用 StringBuilder 从变量构建字符串

c# - 将文档上传到 Sharepoint 时添加元数据

java - 如何在java中创建mongoDB objectid

node.js - 为mongoose查找查询结果添加一个字段

c# - 在运行时删除静态添加的控件

python - 我需要根据两列数据帧生成新列,如何才能更快?

java - 跟踪频率时线程安全哈希表放置的可扩展模式

Java Web 应用程序真的很慢