我遇到了 MongoDB 的性能问题。
运行时间:
我写了一个守护进程,它可以异步删除和插入记录。大多数集合每小时都会被清除,并且它们将获得新的插入数据(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语句来捕获这种异常,但它不应该首先发生。我正在寻找解决此问题的解决方案,而不是解决它。
我想问题在于工作集+索引太大而无法存储在内存中,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 命令。
最佳答案
一些优化可能是可能的:
确保您的 mongodb 未在 verbose 模式下运行,这将确保最少的日志记录,从而确保最少的 I/O。否则它会将每个操作写入日志文件。
如果应用程序逻辑可能,请将您的插入转换为批量插入。大多数 mongodb 驱动程序都支持批量插入。 http://www.mongodb.org/display/DOCS/Inserting#Inserting-Bulkinserts
与其对每条记录进行一次删除操作,不如尝试批量删除。
例如。收集 1000 个文档的“_id”,然后使用 $in 运算符触发删除查询。
您对 mongoDb 的查询将减少 1000 倍。
如果您要删除/插入同一文档以刷新数据,请尝试考虑更新。
您正在运行哪种守护进程?如果您可以分享更多相关信息,也可以对其进行优化以减少 CPU 负载。
关于c# - MongoDB慢写导致socket超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093679/
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p