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)