node.js - 每秒真实世界的 mongo 查询/更新

标签 node.js mongodb mongoose

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

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

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

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

此外,我的后期处理与 mongo 服务器在同一个机器上运行,因此这里没有网络延迟等问题。 post process 运行时,cpu 比较安静,偶尔会出现 50% 左右的峰值。我还注意到在此过程中我的锁定百分比很高,但我猜这仅仅是因为我对集合发布了太多更新。在我的后期处理过程中,锁定 % 状态为 80+%。

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

最佳答案

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

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

关于node.js - 每秒真实世界的 mongo 查询/更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575681/

相关文章:

node.js - 无法实例化扩展 EventEmitter 的导出自定义模块 Nodejs 的实例

json - Node.js 和 json.s

javascript - 在特定 Node 版本上运行应用程序

php - 将 Mongo 游标正确解析为 PHP

javascript - Mongoose 没有将更新的文档保存到数据库

node.js - Mongoose 排除数组中的字段

node.js - 更新数组中的多个元素

node.js - connect-redis client.unref 不是函数

mongodb - Mongo Docker镜像-无法在其他端口上运行

node.js - 在 mongoose 模式中使用 geoJSON 并在查询中使用它