Node+Mongodb 架构常见性能问题总结
简介
目前的我们的一个项目,后端使用 node+mongodb+redis 搭建,已运行 2 年,目前日 pv 在 100W 左右。
配置:
两台阿里云 ECS (2 vCPU 4 GB ) 一个阿里云 mongodb。(4核8G,节点数,三节点)
此文由近两年来实际血泪经验,无教科书式说教。
常见现象1:Web 服务超时,node 服务内存占用高。Mongodb CPU ,IOPS 高
正常情况下单个 node 服务占用内存在 100-200M 左右,此时内存可能涨到500-600M以上,Mongodb CPU 超过90%。web 服务失去响应。
问题原因:
node 每增加一个回调/promise 异步任务,都会创建 一个microtask
到执行队列,由于太多的microtask
等待处理完成,新的microtask
在任务队列的尾端,得不到处理,web QPS 也因此迅速下降,造成 web 服务内存占用高。这种情况一般是后端 Mongodb 处理不及时拖累 node 服务,这是常见的性能问题。
调试方法:
登录 mongo 执行执行执行 db.currentOp()
,查看是否有执行慢的的任务。如:
mgset-2286:PRIMARY> db.currentOp()
{
"inprog" : [
{
"desc" : "conn33170850",
"threadId" : "47003141687040",
"connectionId" : 33170850,
"client" : "10.24.141.149:49804",
"active" : true,
"opid" : -1695682558,
"secs_running" : 0,
"microsecs_running" : NumberLong(9),
"op" : "command",
"ns" : "admin.$cmd",
"query" : {
"currentOp" : 1
},
"numYields" : 0,
"locks" : {
},
"waitingForLock" : false,
"lockStats" : {
}
},
{
"desc" : "conn33150143",
"threadId" : "47003176310528",
"connectionId" : 33150143,
"client" : "10.24.141.149:55818",
"active" : true,
"opid" : -1695713531,
"secs_running" : 148,
"microsecs_running" : NumberLong(148290542),
"op" : "remove",
"ns" : "mydb.bhd_record",
"query" : {
"recType" : 9,
"content.id" : ObjectId("5a044ed48162b041725e3435")
},
"numYields" : 283277,
"locks" : {
"Global" : "w",
"Database" : "w",
"Collection" : "w"
},
"waitingForLock" : false,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(283278),
"w" : NumberLong(283278)
}
},
"Database" : {
"acquireCount" : {
"w" : NumberLong(283278)
}
},
"Collection" : {
"acquireCount" : {
"w" : NumberLong(283278)
}
}
}
}
],
"ok" : 1
相关文章