如何调试慢速meteor方法?

如何调试慢速meteor方法?,meteor,Meteor,我的一些流星方法最近神秘地减慢了速度。虽然它们过去非常敏捷,但很多都需要10秒左右的时间 没有导致经济放缓的因素: 另外,代码库的慢段没有明显改变 机器负载(cpu负载徘徊在30%左右) 附加数据库负载(未添加新查询) 返回数据的传输时间(返回未定义) 阻塞方法(我在方法中尝试了这个.unblock()) 我在服务器端和客户端都使用console.time()/console.timeEnd()进行了调试。服务器端代码运行大约需要0.3秒,但是客户端直到meteor.call()之后大约11

我的一些流星方法最近神秘地减慢了速度。虽然它们过去非常敏捷,但很多都需要10秒左右的时间

没有导致经济放缓的因素:

  • 另外,代码库的慢段没有明显改变
  • 机器负载(cpu负载徘徊在30%左右)
  • 附加数据库负载(未添加新查询)
  • 返回数据的传输时间(返回未定义)
  • 阻塞方法(我在方法中尝试了这个.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;
}
函数取消某物(某物ID,原因){
console.time('cancelSomething method');
检查(somethingId、String);
检查(原因、字符串);
如果(!AuthChecks()))
抛出新流星。错误(401,“未授权”);
var somethings=MySomethings.findOne({''u id':somethingId});
如果(!某物)
抛出新的流星。错误(404,“未找到的东西”);
var returnVal=SomethingService.cancel(某物,原因);

console.timeEnd('cancelSomething method');//很有趣。我认为如果不了解更多关于你的应用程序的信息,很难回答这个问题,但我有一些建议可以帮助你朝着正确的方向前进

舞台调度 如果我们可以假设计时器工作正常,那么可能发生的情况是服务器无法开始执行该方法,因为同一客户端的另一个方法调用已经在进行中。请查看文档。答案可能很简单,只需在其中一个方法的顶部放置一个
。取消阻止
你的方法

同步 如果
SomethingService.cancel
执行了导致大量DDP流量的操作,则可能会使客户端阻塞一段时间,使其无法执行回调。例如,如果:

  • 修改或创建了大量文档,这些文档必须同步到客户端
  • 间接导致重新运行昂贵的订阅(我的钱在这一个上)

最新答案 问题似乎与调用
observe
有关,考虑到您的高CPU负载,这很有意义。坦率地说,我没有提出这一建议是有点愚蠢的,因为我已经回答了一个类似的问题。如果您想试着保持观察,下面是一些额外的建议:

  • 使用
  • 使用oplog observe驱动程序当前支持的选择器尽量缩小观察范围。支持的选择器应在meteor 1.0或之前改进
  • 将字段限制为仅需要的字段
  • 通过添加facts包检查oplog跟踪是否正常工作

感谢您的回信。我将此.unblock()添加为方法的第一行,时间安排相同。我已向问题添加了其他信息(文档数)糟糕。我在这堆文件中添加了另一个想法。也许如果我继续猜测,我最终会做对。:)我还打赌昂贵的订阅理论。更具体地说,我猜取消会导致数据库更改,这会导致客户端依赖项的低效重新呈现,从而阻塞UI线程并延迟回调的启动。要进行调试,我会:使用ddp代理(排除任何非客户端),记录所有模板呈现函数,并使用onInvalidate回调跟踪所有订阅。@alanning谢谢,我会在有时间(接下来的几天)时这样做我们最终发现这与观察者有关。当我们对观察者进行评论时,我们看到响应时间恢复到了预期的水平。此后,我们开始重写应用程序,使用节点的EventEmitter模式,而不是观察者。我们的应用程序在数据库中大约有1000个文档可管理,但在数据库中有3500个文档时,cpu峰值达到100%。耸耸肩也许1.0.0会更好?当Meteor不是作为副本集的一部分运行时,10秒是mongo的默认轮询间隔。我想知道你的数据库设置是否有问题…@AndrewMao对轮询的想法很好,但这是Meteor方法,我正在测试Meteor.call的回调时间('cancelSomething')发生。方法调用/回调不应与集合的反应式更新有关。
  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
  });