Node+Mongodb 架构常见性能问题总结

2020-05-22 00:00:00 索引 数据库 执行 队列 服务

简介

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

相关文章