【发布时间】: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+。