当我使用带有.stream()的mongo tailable游标时,我的CPU过热

Nat*_*aux 5 mongoose mongodb node.js

我正在尝试使用带流的tailable游标.我们正在使用mongoose并且它可以工作但是当我用这段代码启动我的服务器时:

const listStream = ListsSub.find()
  .tailable({
    await_data: true,
    numberOfRetries: -1,
  })
  .stream();
Run Code Online (Sandbox Code Playgroud)

我的CPU过热了.

代码处于活动状态时的Activity Monitor

在此输入图像描述

评论.stream()make使服务器再次运行良好.

代码进行评论时的活动监视器

在此输入图像描述

没有它,我真的不知道该怎么做.这是我的代码吗?有谁遇到过同样的问题?

编辑:

  • 猫鼬:4.11.3
  • mongodb:3.4.6
  • 节点:8.1.2
  • 服务器和mongodb在同一台机器上

Nei*_*unn 7

这里有几件事要做.第一个值得注意的事情是使用.cursor()方法而不是.stream()在使用时发布的弃用警告中实际指示的方法:

DeprecationWarning:Mongoose:在mongoose> = 4.5.0中不推荐使用Query.prototype.stream(),而是使用Query.prototype.cursor()代替

第二个值得注意的事情是,如.cursor()文档中所指定的,这现在直接从底层驱动程序返回"包装流"接口.因此,建议使用现代.addCursorFlag()选项而不是.tailable()mongoose 中的方法Query.

一旦这两个措施都到位,我就会看到两个mongodnode进程0%之间的空闲CPU 在更新间隔之间降低.

最好使用以下列表进行模拟.

const mongoose = require('mongoose'),
      Schema = mongoose.Schema;

mongoose.Promise = global.Promise;
mongoose.set('debug',true);

const uri = 'mongodb://localhost/tailing',
      options = { useMongoClient: true };

const subSchema = new Schema({
  name: String
},{
  capped: { size: 1024, max: 1000 }
});

const Sub = mongoose.model('Sub', subSchema);

function log(data) {
  console.log(JSON.stringify(data, undefined, 2))
}

(async function() {

  try {

    const conn = await mongoose.connect(uri,options);

    //await Sub.remove({});

    await Sub.insertMany(Array(50).fill(1).map((e,i) => ({ name: i+1 })));

    let stream = Sub.find()
      .cursor()
      .addCursorFlag('tailable',true)
      .addCursorFlag('awaitData',true);
      /*
      .tailable({
        await_data: true,
        numberOfRetries: -1
      })
      .cursor();
      */

    stream.on('data',function(data) {
      log(data);
    });

    let counter = 50;


    setInterval(async function() {
      counter++;
      await Sub.insertMany({ name: counter });
    },10000);

  } catch(e) {
    console.log(e);
  } finally {
    //mongoose.disconnect();
  }

})();
Run Code Online (Sandbox Code Playgroud)

作为实际写入捕获的普通旧顶部输出发生:

top - 21:38:29 up 12 days,  1:23,  3 users,  load average: 0.06, 0.03, 0.04
Tasks: 116 total,   2 running, 114 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 98.6 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2045968 total,   207452 free,   813908 used,  1024608 buff/cache
KiB Swap:  2097148 total,  2097124 free,       24 used.  1028156 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1257 mongodb   20   0 1946896 487336  34892 S  0.7 23.8 130:37.67 mongod
28233 neillunn  20   0 1021460  41920  22996 S  0.3  2.0   0:00.67 node
30956 neillunn  20   0  101472   4384   3352 S  0.3  0.2   0:20.95 sshd
Run Code Online (Sandbox Code Playgroud)