如何排查MongoDB CPU利用率高的问题?


  • 註冊用戶

    从应用的角度考虑,我们都可以从哪些方面去排查MongoDB CPU利用率高的问题?


  • Lv 1

    Step1: 分析数据库正在执行的请求

    用户可以通过 Mongo Shell 连接,并执行 db.currentOp() 命令,能看到数据库当前正在执行的操作,如下是该命令的一个输出示例,标识一个正在执行的操作。重点关注几个字段

    • client:请求是由哪个客户端发起的?
    • opid:操作的opid,有需要的话,可以通过 db.killOp(opid) 直接干掉的操作
    • secs_running/microsecs_running: 这个值重点关注,代表请求运行的时间,如果这个值特别大,就得注意了,看看请求是否合理
    • query/ns: 这个能看出是对哪个集合正在执行什么操作
    • lock*:还有一些跟锁相关的参数,需要了解可以看官网文档,本文不做详细介绍

    db.currentOp 文档在这里,多看官网文档

        {
            "desc" : "conn632530",
            "threadId" : "140298196924160",
            "connectionId" : 632530,
            "client" : "11.192.159.236:57052",
            "active" : true,
            "opid" : 1008837885,
            "secs_running" : 0,
            "microsecs_running" : NumberLong(70),
            "op" : "update",
            "ns" : "mygame.players",
            "query" : {
                "uid" : NumberLong(31577677)
            },
            "numYields" : 0,
            "locks" : {
                "Global" : "w",
                "Database" : "w",
                "Collection" : "w"
            },
            ....
        },
    

    这里先要明确一下,通过 db.currentOp() 查看正在执行的操作,目的到底是什么?

    并不是说我们要将正在执行的操作都列出来,然后通过 killOp 逐个干掉;这一步的目的是要看一下,是否有「意料之外」的耗时请求正在执行。

    比如你的业务平时 CPU 利用率不高,运维管理人员连到数据库执行了一些需要全表扫描的操作,然后突然 CPU 利用率飙高,导致你的业务响应很慢,那么就要重点关注下那些执行时间很长的操作。

    一旦找到罪魁祸首,拿到对应请求的 opid,执行 db.killOp(opid) 将对应的请求干掉。

    如果你的应用一上线,cpu利用率就很高,而且一直持续,通过 db.currentOp 的结果也没发现什么异常请求,可以进入到 Step2 进行更深入的分析。

    Step2:分析数据库慢请求

    MongoDB 支持 profiling 功能,将请求的执行情况记录到同DB下的 system.profile 集合里,profiling 有3种模式

    profiling 设置文档在这里,多看官网文档

    • 关闭 profiling
    • 针对所有请求开启 profiling,将所有请求的执行都记录到 system.profile 集合
    • 针对慢请求 profiling,将超过一定阈值的请求,记录到system.profile 集合

    默认请求下,MongoDB 的 profiling 功能是关闭,生产环境建议开启,慢请求阈值可根据需要定制,如不确定,直接使用默认值100ms。

    operationProfiling:
      mode: slowOp
      slowOpThresholdMs: 100
    

    基于上述配置,MongoDB 会将超过 100ms 的请求记录到对应DB 的 system.profile 集合里,system.profile 默认是一个最多占用 1MB 空间的 capped collection。

    查看最近3条 慢请求,{$natrual: -1} 代表按插入数序逆序
    db.system.profile.find().sort({$natrual: -1}).limit(3)
    

    在开启了慢请求 profiling 的情况下(

    本帖下載内容已隐藏,请登入以查看隐藏内容!


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待