如何调试慢速流星方法?

时间:2014-01-30 03:26:58

标签: meteor

我的一些流星方法最近神秘地放慢了速度。虽然它们过去很活泼,但很多都需要10秒左右。

不会造成经济放缓的事情:

  • 其他功能,代码库的减速部分未发生重大变化
  • 机器负载(cpu负载徘徊在30%左右)
  • 其他数据库加载(未添加新查询)
  • 返回数据的传输时间(返回undefined)
  • 阻止方法(我在方法中尝试了this.unblock())

我在服务器端和客户端使用console.time()/ console.timeEnd()进行了调试。服务器端代码需要大约0.3秒才能运行,但是客户端在meteor.call()之后大约11秒才会收到回调...

这是服务器方法:

function cancelSomething(somethingId, reason) {
  console.time('cancelSomething method');
  check(somethingId, String);
  check(reason, String);

  if (!AuthChecks()))
    throw new Meteor.Error(401, 'Not Authorized');

  var something = MySomethings.findOne({'_id': somethingId});
  if (!something)
    throw new Meteor.Error(404, 'Something not found');

  var returnVal = SomethingService.cancel(something, reason);
  console.timeEnd('cancelSomething method'); // <--- prints "cancelSomething 350ms" or there abouts
  return returnVal;
}

客户机侧:

  console.time('meteorCall');
  Meteor.call('cancelSomething', this._id, reason, function(err) {
    if (err) {
        console.log('an error occurred', err);
    }
    console.timeEnd('meteorCall'); // <--- prints "meteorCall 11500" or so
  });

编辑: 我注意到db中“somethings”中的文档数量存在一定的相关性。 w / 500文件需要大约1秒才能收到客户端的回报,5000则需要大约8.5秒......

1 个答案:

答案 0 :(得分:4)

有趣。我认为在不了解您的应用程序的情况下很难回答这个问题,但我有一些建议可以帮助您指导正确的方向。

阻断

如果我们可以假设定时器工作正常,可能正在发生的是服务器无法开始执行该方法,因为另一个方法调用由同一客户已在进行中。请查看文档中的unblock。答案可能就像在您的某个方法的顶部放置this.unblock一样简单。

同步

如果SomethingService.cancel做了导致大量DDP流量的事情,那么可能会占用客户端一段时间并使其无法执行回调。例如,如果它:

  • 修改或创建了许多文档,然后必须同步到客户端
  • 间接导致重新运行昂贵的订阅(我的钱就在这个上面)

更新答案

似乎问题必须通过调用observe,考虑到你的高CPU负载,这很有意义。坦率地说,我没有提出这个问题,这有点愚蠢,因为我已经回答了类似的问题here。如果您想尝试保持观察,这里有一些额外的建议:

  • 使用oplog tailing
  • 尝试使用oplog observe驱动程序当前支持的选择器尽可能地缩小观察范围。支持的选择器应该在meteor 1.0之前或之前改进。
  • 将字段限制为仅限于您需要的字段。
  • 通过添加事实包来检查oplog尾部是否正常工作。