【问题标题】:Nodejs Mongo query stream - CPU busy?Nodejs Mongo 查询流 - CPU 忙?
【发布时间】:2015-05-23 00:21:35
【问题描述】:

我们有一个 mongoosejs 客户端,它查询大型 mongodb 集合(大约 1000 万条记录)并通过管道传输到转换流。当我们运行这段代码时,节点进程占用了 100% 的 CPU 并变得忙碌,这表明背压建立了。如果我们周期性地强制读取流的 pause(),比如每 100 条记录,持续 10 毫秒,CPU 就不会那么忙。

我了解流 API 应该检测“背压”问题并在开发人员无需调用 pause() 和 resume() 的情况下处理它们。为什么 CPU 对这段代码如此忙碌,开发这样的管道的最佳实践是什么?

var Transform = require('stream').Transform;
var util = require('util');
var zlib = require("zlib");

var Model = mongoose.model("xxx", someSchema)

var TransformStream = function() {
  return Transform.call(this, {
    objectMode: true
  });
};

util.inherits(TransformStream, Transform);

var transformChunk = function(chunk){
    //return transformed chunk here
}

TransformStream.prototype._transform = function(chunk, encoding, callback) {
    var transformed = transformChunk(chunk);
    this.push(transformed, "utf-8");
    callback();
}

function main(){
    var zipStream = zlib.createGzip();
    var transformer = new TransformStream();
    var queryStream = Model.find(filter).stream();
    // outstream is a grid fs stream
    return queryStream.pipe(transformer).pipe(zipStream).pipe(outstream);   
}

【问题讨论】:

    标签: node.js stream mongoose transform


    【解决方案1】:

    背压可能会导致您的转换方法阻塞。如果可读流 (mongo) 生成数据的速度足够快,并且外流存储的速度足够快,那么如果您的转换器正在做任何重要的事情,CPU 利用率就会很高。您的延迟限制了变压器,减少了 CPU 负载。

    在文档中并不清楚push 的返回结果有什么相关性,它可能可以忽略(但在下游背压的情况下可能只会消耗内存)。

    由于我自己寻求答案,我发现了您的问题!

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2016-08-28
      相关资源
      最近更新 更多