Node.js:使用带有暂停和恢复的mongodb流有时会导致100%的CPU利用率

时间:2015-08-24 07:08:09

标签: node.js mongodb

我有一个从mongodb获取数据并为其创建流的进程。我从DB获取记录,点击一些API,然后将结果存储回DB。由于数据库提取比API响应快得多,因此我在每40条记录之后暂停并恢复流。但是,过了一会儿,过程在中间停止,没有任何错误。当我看到日志时,一切似乎都很好但不确定为什么这个过程不会继续进行。我已经尝试在恢复前设置1秒的超时但到目前为止没有运气。此外,这个问题是零星的,有时它的工作非常好,但很多时候它只是暂停在中间。有没有更好的推荐方法来处理这种情况

var productStream = db.product.find(query).stream();

然后我像这样处理每个产品

productStream.on('data', function (product) {

    //do some processing

})

我维护两个变量来跟踪流中的记录数和已处理记录的数量。当计数达到40时,我暂停流。

if (count == 40) {
  console.log(totalCount, Date());
  productStream.pause();
}

在此处理期间,我继续暂停和恢复流。这是我用来调用简历的函数

function checkResumeStream() {
  if (count == 40 && processed_count >= count) {
    count = 0;
    processed_count = 0;
    productStream.resume();
  }
}

更新 现在,当我仔细检查日志以及top命令时,我可以看到,每当processed_count达到38时,日志几乎停止(当它达到40时它会恢复)。此外,当我检查top命令的结果时,我可以看到在此期间mongod的CPU使用率增加到100%。我有mongodb设置来记录db.system.profile中每个查询慢于100ms,但没有记录任何查询。所以我不明白mongod在哪里耗尽所有CPU?

0 个答案:

没有答案