MongoDB出现CPU飚高,如何强制停止正在执行的操作

Posted yaohonv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB出现CPU飚高,如何强制停止正在执行的操作相关的知识,希望对你有一定的参考价值。

  如果发出了一个执行耗时很长的任务给MongoDB服务器,客户端强制终止会导致任务依然在服务器端执行。

  这时MongoDB提供了查询和管理正在执行任务的方式。

// db.currentOp()   获得当前的所有`in progressing`的操作,包括insert/query/update/remove/getmore/command等
> db.currentOp(true)

  返回的数据结构如下:

{ "inprog" :   
        [   
            {  
                        "opid" : 3434473,//操作的id  
                        "active" : <boolean>,//是否处于活动状态  
                        "secs_running" : 0,//操作运行了多少秒  
                        "op" : "<operation>",//具体的操作行为,包括(insert/query/update/remove/getmore/command)  
                        "ns" : "<database>.<collection>",//操作的命名空间,如:数据库名.集合名  
                        "query" : {//具体的操作语句  
                        },  
                        "client" : "<host>:<outgoing>",//连接的客户端信息  
                        "desc" : "conn57683",//数据库连接描述  
                        "threadId" : "0x7f04a637b700",//线程id  
                        "connectionId" : 57683,//数据库连接id  
                        "locks" : {//锁的相关信息  
                                "^" : "w",  
                                "^local" : "W",  
                                "^<database>" : "W"  
                        },  
                        "waitingForLock" : false,//是否在等待并获取锁,  
                        "msg": "<string>"  
                        "numYields" : 0,  
                        "progress" : {  
                                "done" : <number>,  
                                "total" : <number>  
                        }  
                        "lockStats" : {  
                                "timeLockedMicros" : {//此操作获得以下锁后,把持的微秒时间  
                                        "R" : NumberLong(),//整个mongodb服务实例的全局读锁  
                                        "W" : NumberLong(),//整个mongodb服务实例的全局写锁  
                                        "r" : NumberLong(),//某个数据库实例的读锁  
                                        "w" : NumberLong() //某个数据库实例的写锁  
                                },  
                                "timeAcquiringMicros" : {//此操作为了获得以下的锁,而耗费等待的微秒时间  
                                        "R" : NumberLong(),//整个mongodb服务实例的全局读锁  
                                        "W" : NumberLong(),//整个mongodb服务实例的全局写锁  
                                        "r" : NumberLong(),//某个数据库实例的读锁  
                                        "w" : NumberLong()//某个数据库实例的写锁  
                                }  
                        }  
                },  
                .....  
               
        ]   
    }

 

找到其中耗时secs_running很长的操作,有可能是异常操作,确认后可> db.killOp(opid)

以上是关于MongoDB出现CPU飚高,如何强制停止正在执行的操作的主要内容,如果未能解决你的问题,请参考以下文章

CPU飚高问题排查基本步骤

强制停止正在执行的方法

强制停止正在执行的方法

jstack应用-查找CPU飚高的原因

线上CPU飚高(死循环,死锁...)?帮你迅速定位代码位置

Cpu飚高show-busy-java-threads一件脚本排查与Arthas线上诊断工具排查实战