在从3.5.7升级到3.8.4之后,Mongoose的性能下降

时间:2014-01-23 17:33:34

标签: node.js mongoose

我将mongoose的版本号从3.5.7更改为3.8.4,并且在导入过程中性能受到了极大的打击。此过程从文件中读取行并填充大约250万行的空数据库(无索引)。

这是我所做的唯一改变;只是升级版本。我可以来回切换,看看性能的差异。

性能命中率是:1)该过程固定在100%CPU,之前它的运行速度可能超过25%左右。 2)进入数据库进入数据库的速度很慢。 3.5.7每20秒插入大约10K条记录,而3.8.4似乎每秒大约插入1条记录。 3)nodejs似乎“消失”成CPU密集型并且所有其他I / O功能被阻塞(http请求等);以前系统仍然非常敏感。

很难隔离代码,但大致就是这里发生的事情:

  • 从文件中读取一行
  • 解析
  • 运行查询以查看记录是否已存在
  • 使用读取行
  • 中的值插入/更新记录
  • 将现有记录写入已打开的文件流
  • 继续文件中的下一行

猜测一下,我会说这与请求在mongoose依赖的底层驱动程序或者自己的mongoose中受到限制的方式有关。我的第一个想法是尝试处理请求排队等待并暂停读取文件的情况。这在编写查询结果时非常有效(当文件开始缓存写入时暂停查询流,然后在排出时恢复)。但是我无法找到猫鼬可能会发出有关其背压的信息。

我首先升级的原因是因为我设置了一个我读过的mongoose中处理的事件时得到的内存泄漏错误(对不起,我失去了对它的引用)。

我想保持升级并找出问题所在。对它可能是什么的任何想法?是否有某个事件给我通知背压,所以我可以暂停/恢复输入流?

1 个答案:

答案 0 :(得分:0)

我通过简单地恢复到3.5.7并以另一种方式解决原始内存泄漏警告来解决这个问题。

我试图隔离我的代码,但我能够提出的最糟糕的问题是高内存消耗(我通过归零对象来解决这个问题,这显然有助于GC找出它可以收集的内容)。我开始添加不相关的代码,但在某些时候,很明显问题不在于mongoose或mongodb驱动程序本身。

我唯一猜测当我升级mongoose时导致性能问题的原因是mongoose所依赖的一些库引入了一个我的非猫鼬相关代码不能很好地发挥作用的变化。

如果我接触到它的底部,我会回来并发布更明确的答案。