首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询时间猫鼬偶尔需要3-4秒

查询时间猫鼬偶尔需要3-4秒
EN

Stack Overflow用户
提问于 2016-05-05 19:48:53
回答 1查看 827关注 0票数 1

我已经为我正在开发的多人游戏编写了后端节点服务器,大多数情况下,每个请求大约需要20-100 to才能解决。但是,有时( 50次请求中可能有1次)我会执行同样的请求,这需要2000+ms来解决。

服务器完全用node.js编写,并托管在heroku上。我用猫鼬来调用数据库。

下面是日志的截图,在顶部您可以看到查询是如何正常工作的。请求在19:03:03.68发出,响应在19:03:03.73发出,所有数据保存在19:03:03.74结束。Heroku将请求记录为采取58 as,这是期望和预期的结果。

下面是问题发生的时候。您可以看到来自两个独立客户端的多个请求(每个客户端每秒发送一个请求,这是正确的),但是,这些请求会累积起来,在大约2000到5000 is之后,它们都会很快地逐一解析。我试着缩小这个问题,但我认为这与我查询数据库的时间有关,因为您可以看到有多个请求出现,但是对数据库的第一个查询直到大约2300‘s之后才真正解决。据我所知,这些请求与那些在20-100 As内解析并完全随机发生的请求是完全相同的。

实际代码与服务器上的代码类似(为了这个问题而简化):

代码语言:javascript
复制
console.log (“request received”);
    Game.findOne({‘id’: gameID}, function(err, theGame){
        console.log("First Query");

我还为数据库打开了mongo,以查找花费了大量时间(>2000 of )的查询,这些代码如下:

代码语言:javascript
复制
db.system.profile.find( {millis: {$gt : 2000} } ).sort( { ts: 1} );

以下是稍加修改的结果,其中应包括所有相关内容:

代码语言:javascript
复制
{ "op" : "update", "ns" : "theDb.players", "query" : 
  { "_id" : ObjectId("572b8eb242d70903005df0df") 
  }, "updateobj" : 
  { "$set" : 
    { "lastSeen" : ISODate("2016-05-05T18:19:30.761Z"), "timeElapsed" : 16 
  } 
}, "nscanned" : 1, "nscannedObjects" : 1, "nMatched" : 1, "nModified" : 1, "fastmod" : true, "keyUpdates" : 0, "writeConflicts" : 0, "numYield" : 0, "locks" : 
{ "Global" : 
  { "acquireCount": 
    { "r" : NumberLong(2), "w" : NumberLong(2) } 
  }, "MMAPV1Journal" : 
  { "acquireCount" : 
    { "w" : NumberLong(2) }, "acquireWaitCount" : 
    { "w" : NumberLong(1) }, "timeAcquiringMicros" : 
    { "w" : NumberLong(7294179) } 
  }, "Database" : 
  { "acquireCount" : 
    { "w" : NumberLong(2) } 
  }, "Collection" : 
  { "acquireCount" : 
    { "W" : NumberLong(1) } 
  }, "oplog" : 
  { "acquireCount" : 
    { "w" : NumberLong(1) } 
  } 
}, "milli" : 2298, "execStats" : {}, "ts" : ISODate("2016-05-05T18:19:33.060Z")

第二项结果:

代码语言:javascript
复制
{ "op" : "update", "ns" : "theDb.connections", "query" : 
  { "_id" : ObjectId("572b8eaf42d70903005df0dd") 
  }, "updateobj" : 
  { "$set" : 
    { "internalCounter" : 3, "lastCount" : 3, "lastSeen" : ISODate("2016-05-05T18:19:30.761Z"), "playerID" : 128863276517, "sinceLast" : 0 
    } 
  }, "nscanned" : 1, "nscannedObjects" : 1, "nMatched" : 1, "nModified" : 1, "keyUpdates" : 0, "writeConflicts" : 0, "numYield" : 0, "locks" : 
  { "Global" : 
    { "acquireCount" : 
      { "r" : NumberLong(2), "w" : NumberLong(2) 
      } 
    }, "MMAPV1Journal" : 
    { "acquireCount" : 
    { "w" : NumberLong(2) }, "acquireWaitCount" : 
      { "w" : NumberLong(1) }, "timeAcquiringMicros" : 
      { "w" :NumberLong(7294149)  } 
    }, "Database" : 
    { "acquireCount" : 
      { "w" : NumberLong(2) } 
    }, "Collection" : 
    { "acquireCount" : 
      { "W" : NumberLong(1) } 
    }, "oplog" : 
    { "acquireCount" : 
      { "w" : NumberLong(1) } 
    } 
  }, "millis" : 2299, "execStats" : {},"ts" : ISODate("2016-05-05T18:19:33.061Z")

我真的需要确保任何请求的延迟永远不超过500毫秒,否则它在游戏本身非常恼怒。我真的不知道是什么导致了这件事,以及如何找出更多。

我认为问题的原因是timeAcquiringMicros太长了。但我不知道是什么导致了这一切。

*注意,客户端只使用标准http请求请求数据,我目前没有使用任何套接字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-10 22:52:37

好吧,我终于解决了这个问题。这个问题实际上与我所做的一切无关。我在使用mlab提供的与heroku相关的沙箱计划,这让我的应用程序与其他人竞争处理时间,也使用沙箱计划。他们的查询减慢了数据库的速度,导致响应时间激增。

解决方案:我必须升级到他们的共享集群计划。自升级以来,我在查询时间上没有任何异常。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37059066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档