简介
目前的我们的一个项目,后端使用 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,
"micr