【问题标题】:Real world mongo query/updates per second每秒真实世界的 mongo 查询/更新
【发布时间】:2015-04-18 23:39:41
【问题描述】:

我目前在生产中使用 mongo,并且到目前为止对它感到满意。我只是想更好地了解如何提高吞吐量。我的理解可能存在核心空白,我正在努力填补这一空白。

我目前有一个相对较小的数据集(少于 500 万个文档)。作为我的应用程序的一部分,我必须每天轮换数据,这意味着我将在集合中插入 1M 到 5M 之间的数据并滚出旧数据。我可以使用两个集合很容易地做到这一点,其中一个是沙盒集合,新数据被泵入其中,完成后,我将其重命名为“实时”集合,这样它非常快,我不必等待一个 remove() 来完成。

我当前的问题是,在我的服务器上,这是一个 16gb 内存的四核 linux 机器,我的数据无法超过每秒约 2k 的更新。插入所有数据 (1M+) 后,我有各种后期处理来读取然后更新记录。该过程在功能上运行良好,但无论我尝试什么,我都无法达到每秒超​​过 4K(读取+写入)的速度。

我已将集合中的索引修剪为我需要的几个单字段索引,并且我尝试了各种方法,例如使用单个 esb ssd 假脱机一个 ec2 mediumxlarge 实例,我得到了相同的结果。我也尝试过分叉读取/更新数据的工作进程,无论我放置多少工作人员,最大操作数都不会真正移动。

另外,我的后期处理与 mongo 服务器在同一个机器上运行,因此这里没有网络延迟等。当 post 进程运行时,cpu 相对安静,偶尔可能会飙升 50% 左右。我还注意到在此过程中我的锁定百分比很高,但我猜这仅仅是因为我对集合发布了如此多的更新。在我的后期处理过程中,锁定百分比保持在 80+%。

我的平均文档大小约为 1.4k。集合上有 6 个字段级索引。一个典型的后期处理(使用节点)是流式传输具有字段 x = y 的所有文档,更新该记录上的不同字段,然后保存它。在这个过程中会发生一些计算。起初我认为我的计算是瓶颈,所以为了解决这个问题,我分叉了多个 (4) 节点子进程,每个子进程不超过 40% 的 cpu。我非常有信心我的申请很好。如果我使用 1 或 4 个节点进程,我大约需要 20 分钟来处理 1M 文档。

【问题讨论】:

  • 如果您向我们展示您的文档结构及其操作,我们或许可以提供更多建议。
  • 我添加了有关文档大小等的更多详细信息。希望对您有所帮助!
  • 我想你可能只是争用了数据库锁。说更多有用的东西需要更多信息——比如 mongostat 的一些输出、示例文档、您正在执行的实际操作的示例(或它的代码)。
  • 感谢您的帮助.. 我认为您是对的。我实际上正在转向使用 mongo 的批量过程并获得更好的结果。我看到使用批量 api 每秒持续 3k 更新......所以我现在将使用它。
  • 此外,当我删除索引时使用批量 api - 我看到的数字要好得多:每秒更新 10k+。

标签: node.js mongodb mongoose


【解决方案1】:

您无能为力,当您更新其中的单个文档时,mongodb 会锁定整个集合。因此在更新期间读取被阻止。

Version 3.0 应该通过使用 WiredTiger 存储引擎引入文档级锁定来改善这一点。

【讨论】:

  • 我不认为这是我的问题,因为我也在 docker 容器中运行了 mongo 3.0rc8 并尝试了具有文档级别锁定的 tokumx 并且得到了大致相同的结果。
  • mongodb 3.0默认安装使用mmap存储引擎你使用wiredtiger吗?
  • 我没有更改存储引擎.. 很好。但是,我对也具有文档级别锁定的 tokumx 进行了相同的测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多