草庐IT

MongoDB 随机慢查询 - EC2 IOPS

coder 2023-11-03 原文

我在 EC2 实例(7GB RAM)上安装了 mongodb(版本:2.0.8),数据大小仍然小于 1GB。我正在使用配置的 100 IOPS 磁盘来提高磁盘性能。

问题是,我收到了一些随机的慢查询,如下所示(来自 mongo 日志)

db.UserInfoShared query: { _id: "999081873179" } ntoreturn:1 idhack:1 reslen:108 1919ms

几乎 2 秒 !

这只是对一个集合的 _id 查找,该集合包含大约 100,000 个条目,每个条目的大小都小于 500 字节。该实例中仅运行了 mongo,通常此类查找不到 0.01 秒

这可能是什么原因造成的?我应该如何解决它?非常感谢任何帮助...

最佳答案

@angela,@Asya,非常感谢您帮助我。

事实证明,延迟的主要原因是 mongodb GLOBAL LOCK 本身。我们的锁定百分比平均为 5%,有时会达到 30-50% 的峰值,这会导致查询缓慢。

如果你遇到这个问题,你必须做的第一件事就是启用 mongodb MMS 服务 (mms.10gen.com),这会让你深入了解到底发生了什么在您的数据库服务器中。

在我们的案例中,LOCK PERCENTAGE 非常高,并且有多种原因。你要做的第一件事就是阅读关于并发的 mongodb 文档, http://docs.mongodb.org/manual/faq/concurrency/

锁定的原因可能是在应用程序级别、mongodb 或硬件。

1) 我们的应用程序进行了大量的更新并且每次更新(超过100 ops/sec)都持有一个全局锁 mongodb。问题是,当一个不在内存中的条目发生更新时,mongo 必须先将数据加载到内存中,然后再更新(在内存中),整个过程发生在 global lock。如果说整个事情需要 1 秒才能完成(0.75sec 从磁盘加载数据,0.25sec 在内存中更新),其余的更新调用等待(整个 1 秒)这样的更新开始排队……您会注意到您的应用服务器中的请求越来越慢。

它的解决方案(虽然听起来可能很愚蠢)是在进行更新 之前查询 相同的数据。它有效地做的是将“将数据加载到内存”(0.75 秒)部分从 global lock 中移出,这大大降低了您的 lock percentage

2) 造成全局锁的另一个主要原因是mongodb的数据flush到磁盘。基本上每 60 秒(或更短)mongodb(或操作系统)将数据写入磁盘,并在此过程中持有一个 global lock。 (这有点解释随机慢查询)。在您的 MMS 统计信息中,查看 background flush avg 图表...如果它很高,则意味着您必须获得更快的磁盘。

在我们的例子中,我们在 EC2 中迁移到一个新的 EBS 优化 实例,并将我们预置的 IOPS100500 这几乎将 background flush avg 减半,服务器现在更快乐了。

关于MongoDB 随机慢查询 - EC2 IOPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15446132/

有关MongoDB 随机慢查询 - EC2 IOPS的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  5. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  6. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  7. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

  8. ruby - 如何在 Ruby 中生成一个非常大的随机整数? - 2

    我想在ruby​​中生成一个64位整数。我知道在Java中你有很多渴望,但我不确定你会如何在Ruby中做到这一点。另外,64位数字中有多少个字符?这是我正在谈论的示例......123456789999。@num=Random.rand(9000)+Random.rand(9000)+Random.rand(9000)但我认为这是非常低效的,必须有一种更简单、更简洁的方法来做到这一点。谢谢! 最佳答案 rand可以将范围作为参数:pa=rand(2**32..2**64-1)#=>11093913376345012184putsa.

  9. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

  10. ruby-on-rails - 带句点(或句号)的 Rails 查询字符串。 - 2

    我目前正在尝试了解RoR。我将两个字符串传递到我的Controller中。一个是随机的十六进制字符串,另一个是电子邮件。该项目用于对数据库进行简单的电子邮件验证。我遇到的问题是当我输入如下内容来测试我的页面时:http://signup.testsite.local/confirm/da2fdbb49cf32c6848b0aba0f80fb78c/bob.villa@gmailcom我在:email的参数散列中得到的全部是'bob'。我在gmail和com之间留下了.,因为那样会导致匹配根本不起作用。我的路由匹配如下:match"confirm/:code/:email"=>"conf

随机推荐