2

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

我的第一反应当然是从服务器上抓取 mongodb 日志文件。我原以为这会有所启发,但现在我比以往任何时候都更加困惑。我的数据库的主要功能之一是为用户缓存数据,所以我有一个 Collection ('DataCache'),它只存储一个 JSON 字符串(Mongoose 代码):

new Model('DataCache',{ 
  '_id': { type: String, unique: true }, 
 'data': String, 
 'updated': Date });

查看来自“100% CPU”时间的日志,我看到标准更新请求已执行,但花费了大约 47 秒!

Mon Aug  6 08:58:36 [conn28821] update storage.datacache query: { _id: "14954006/mentions/dcc3c69e72da714a0f3bffc518183ebb" } update: { $set: ... } } 47174ms

此请求的数据不再比平时更长(JSON 字符串中约有 1000 个字符;为简洁起见,此处截断了数据)。

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

问题在启动后大约 20 分钟后突然消失,但 CPU 仍然出现奇怪的峰值(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
}

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

4

1 回答 1

6

通常,对于 MongoDB,CPU 峰值来自几个特定问题。通常,MongoDB 的 CPU 非常低。它通常完全受 IO 或内存占用限制。

这是(希望)一个有用的简短列表:

  1. 不好的查询。这是任何没有索引的查询。我注意到DataCache有一个Updated未编入索引的字段。你每次都按那个字段查询吗?
  2. 映射/减少。Map / Reduce 作业通常会将一个核心“固定”在 100%。这些数据库上有多少个内核?你在做 MR 工作吗?
  3. IO 掩码为 CPU。根据报告,CPU 实际上可能是CPU_WAIT,这通常是磁盘 IO。

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

于 2012-08-06T17:16:10.363 回答