我准备好使用在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 });
查看“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
}
编辑:更多图表
答案 0 :(得分:5)
通常在MongoDB中,CPU峰值来自几个特定问题。通常,MongoDB的CPU非常低。它通常完全受IO或内存占用的约束。
这是(希望)一个有用的短名单:
DataCache
有一个未加索引的Updated
字段。你是否按该字段进行了每次查询?CPU_WAIT
,通常是磁盘IO。因此,如果您返回图表,请查看您的IO时间和RAM使用情况。找出你的RAM:数据比率并找出你的IO需求。让我们知道你正在使用什么类型的机器。