如何解决MongoDB服务器突然占用100%CPU的原因?

Zan*_*aes 2 mongoose mongodb node.js

我准备好使用在Amazon Cloud上运行的node.js/mongo应用程序了.我为Mongo服务器设置了3x副本.一切都工作正常,直到大约20分钟前,PRIMARY mongo服务器跳到100%的CPU使用率(通常几乎没有任何用法).我目前只用~10个用户测试应用程序,所以这非常令人担忧.

当然,我的第一反应是从服务器获取mongodb日志文件.我预计这会显露出来,但现在我比以前更加困惑.我的数据库的主要功能之一是为用户缓存数据,所以我有一个Collection('DataCache'),它只存储一个JSON字符串(Mongoose代码):

new Model('DataCache',{ 
  '_id': { type: String, unique: true }, 
 'data': String, 
 'updated': Date });
Run Code Online (Sandbox Code Playgroud)

从"100%CPU"时间看日志,我看到标准的更新请求已经执行,但需要多达47秒!

Mon Aug  6 08:58:36 [conn28821] update storage.datacache query: { _id: "14954006/mentions/dcc3c69e72da714a0f3bffc518183ebb" } update: { $set: ... } } 47174ms
Run Code Online (Sandbox Code Playgroud)

此请求不再是通常的数据(JSON字符串中约为1000个字符;为简洁起见,此处为了截断数据).

我真的不知道还有什么地方可以弄清楚为什么我的用法突然猛增了.我无法想象这个场景有什么不寻常/独特之处,我在日志中看不到任何其他内容,但我非常担心当我们的10个用户扩展到数千时会发生什么......

这个问题在启动后大约20分钟突然消失,但CPU仍然看到奇怪的尖峰(RightScale仪表板图像): RightScale的


更新:这是从mongo打印的有关缓存集合的一些信息,特别是.我不确定问题与缓存集合有什么关系,但它是我在滞后期间看到的最一致的查询...

     {
        "ns" : "storage.datacache",
        "count" : 43949,
        "size" : 132274592,
    "avgObjSize" : 3009.729277116658,
    "storageSize" : 158887936,
    "numExtents" : 13,
    "nindexes" : 5,
    "lastExtentSize" : 33828864,
    "paddingFactor" : 1.0099999999994833,
    "flags" : 1,
    "totalIndexSize" : 10972192,
    "indexSizes" : {
        "_id_" : 4570384,
    },
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

编辑:更多图表 在此输入图像描述 在此输入图像描述

Gat*_* VP 5

通常使用MongoDB时,CPU峰值来自几个特定问题.通常,MongoDB的CPU非常低.它通常完全受IO或内存占用的约束.

这是(希望)一个有用的短名单:

  1. 错误的查询.这是没有索引的任何查询.我注意到DataCache有一个Updated未编入索引的字段.那个领域的每个查询都是你吗?
  2. 地图/减少.Map/Reduce作业通常会将一个核心"挂钩"为100%.您在这些数据库上拥有多少个核心?你在运行MR工作吗?
  3. IO屏蔽为CPU.根据报告,CPU实际上可能是CPU_WAIT,通常是磁盘IO.

因此,如果您返回图表,请查看您的IO时间和RAM使用情况.找出你的RAM:数据比率并找出你的IO需求.让我们知道您正在使用什么类型的机器.