【问题标题】:MongoDB constantly high cpu usageMongoDB持续高cpu使用率
【发布时间】:2016-04-29 08:19:51
【问题描述】:

根据 docker 容器统计,我的 mongo 数据库不断消耗 250% 到 350% 的 cpu。这令人印象深刻,因为它是一个单核系统:P

可悲的是,这是我的生产实例,更可悲的是它必须生存到下一次产品备份,而且还有 3.5 小时的时间。

我尝试做一个 mongotop,但它告诉我所有显示的集合的 0ms 统计信息。我可以做些什么来弄清楚发生了什么吗?

PS:db 运行了 9 周,没有引起任何问题。

【问题讨论】:

  • 那显示了 htop?

标签: mongodb


【解决方案1】:

有一个名为db.currentOp() 的函数列出了当前正在运行的查询以及非常详细的信息,它还包括它们运行的​​持续时间(secs_running)。

然后您可以使用 currentOp.opiddb.killOp() 来终止该查询/操作。

如果db.currentOp() 没有返回任何结果,因为没有查询受到破坏,那么还有db.setProfilingLevel() 将通过将查询存储到“本地”数据库来启用分析。 Here 是来自 "M102: MongoDB for DBAs" 课程的“教程”。

更多信息还可以在这篇来自 Igor Khomenko 的详细文章 "Troubleshooting MongoDB 100% CPU load and slow queries" 中找到。

【讨论】:

  • 感谢您的回答!输出为{ "inprog" : [ ] } :(
  • 我认为您可以启用某种日志记录,然后将花费异常时间的查询存储到“本地”数据库中。如果我能找到更多关于这方面的信息,我会看看。
  • 添加了关于 db.setProfilingLevel() 的信息
  • 好吧,我想通了。确实有人执行了损坏的查询,但在单独的mongo 进程中,所以我无法通过db.curentOP() 看到它。诡异的。我不得不在系统层杀死进程本身。无论如何,我一定会看看这个分析级别,如果你运行一个生产 mongo 听起来很合理:) 谢谢 Daniel!
  • 嘿,对你有好处!我只能推荐 M102 课程,它信息量很大。但是您所说的听起来很奇怪,因为它db.currentOp() 独立于mongo shell 进程,因为它在mongod 服务器上执行,因此您使用哪个连接的shell 无关紧要。也许你只是幸运地使用了另一个 mongo shell 中的时间。
【解决方案2】:

您需要做的第一件也是更重要的事情是检查您的查询类型,例如,在我的情况下,我遇到了同样的问题,当我检查我的日志时tail -f /var/log/mongodb/mongod.log(您可以在@987654322 中配置此日志@) 我只看到了像 db.brands.find({"field":"value"}) 这样的简单查询,但是我检查了“brands”集合中的索引,并且查询中的这个字段没有被索引(db.brands.getIndexes())。我唯一做的就是索引这个字段db.brands.ensureIndex({name:1},{unique:true})。当然,请确保您的字段是否是唯一的,因为在此示例中,我将其设置为唯一的。之后我的 CPU 从 100% 变为 20%。

所以我并不是说这是你的问题,但可能是,在做一些更大的事情之前检查你的查询。

【讨论】:

  • 这对我来说是正确的答案。尽管我使用的是最小的 Azure 虚拟机,但 CPU 使用率下降到恒定的 95-98% 到峰值使用率的 10%
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2014-07-16
  • 2014-08-24
  • 1970-01-01
相关资源
最近更新 更多