我目前正在http://meanjs.org/堆栈上开发一个nodejs应用程序。
我使用newrelic自定义工具来分析我的应用(http://blog.newrelic.com/2014/09/16/nodejs-custom-instrumentation/)
Bench告诉我有一些性能问题 从跟踪分析看来,问题来自于从mongodb接收回调后的猫鼬代码juste(我认为水合部分)。
为了证明这一点,我用mongojs替换一个mongoose find()(参见npm)一:呼叫的平均速度从~1100ms到~20ms!
来自newrelic的截图:
带猫鼬的Perf:
http://postimg.org/image/7bqv2gbnt/
追踪细节(猫鼬):
http://postimg.org/image/eqg6utxjd/
=>主题查找和问题查找之间的代码基本上是mongoose internal + two if:/(参见下面的代码)
Perf with mongojs:
http://postimg.org/image/3tev62art/
我想我一定做错了猫鼬得到这么糟糕的结果,但我无法弄清楚它是什么,任何帮助都会受到赞赏。
<的更新>
使用node-mongodb-native通过mongoose(Document.collection)进行相同的测试,结果类似于我用mongojs得到的结果,这让我觉得问题来自于实例和安全性。猫鼬物体的水合作用)
来自猫鼬的本地驱动程序的Perf:
http://postimg.org/image/67mpo9ncd/
使用的代码:
https://gist.github.com/Nihaux/20e69c5c40fe1faad2c1
<的 / UPDATE >
< 更新2 >
猫鼬使用的版本是:“3.8.17”
< / UPDATE 2 >
< 更新3 - 问题得到解决>
1)我没有限制我对猫鼬请求的要求所以我得到~20个问题对象而不是3 * facepalm *
2)Ryan建议的精益选项确实绕过了水合作用并节省了一些cpu。
3)我最终使用Jetbrains spyjs分析代码,我没有重现原生与猫鼬之间的相同差异。
使用猫鼬+精益选项,执行时间的差异大约增加30%
我想我之前找到了这样的结果,因为我正在为服务器提供服务:
使用猫鼬时,cpu负载过高,进程堆叠
对于本地驱动程序,我处于那个昙花一现的地方,因此没有出现“问题”
< / UPDATE 3 >
以下是我对代码所做的更改:
ThemeDoc.isValidForGame(themeId, function(err, isValid) {
if (isValid) {
其中isValidForGame是:
ThemeSchema.statics.isValidForGame = function(themeId, callback){
mongoose.model('Theme').find({
'_id': themeId,
'available': true
}).exec(function(err, theme) {
if (err) {
callback(err, false);
return;
}
if (theme.length === 0) {
callback(null, false);
return;
}
mongoose.model('Question').find({'theme': themeId}).exec(function(err, questions) {
if (err) {
callback(err, false);
return;
}
if (questions.length === 0) {
callback(null, false);
return;
}
callback(null,true);
});
});
};
到
db.collection('themes').find({_id: mongojs.ObjectId(themeId)})
.limit(1, function (err, themes) {
if (themes.length == 1) {
db.collection('questions').find({'theme': mongojs.ObjectId(themeId)}).
limit(3, function(err, questions) {
if(questions.length == 3) {
问题的要点&主题图式:
https://gist.github.com/Nihaux/395c600879c5d68c5011