千家信息网

Mongo中如何使用killOp干掉Long Running Operation

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇文章给大家分享的是有关Mongo中如何使用killOp干掉Long Running Operation的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。详解:详解curre
千家信息网最后更新 2024年12月12日Mongo中如何使用killOp干掉Long Running Operation

这篇文章给大家分享的是有关Mongo中如何使用killOp干掉Long Running Operation的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

详解:

  1. 详解currentOp()


  2. gechongrepl:PRIMARY> db.currentOp()

  3. {

  4. "inprog" : [

  5. {

  6. "opid" : 6222,

  7. "active" : true,

  8. "secs_running" : 3,

  9. "microsecs_running" : NumberLong(3662328),

  10. "op" : "getmore",

  11. "ns" : "local.oplog.rs",

  12. "query" : {


  13. },

  14. "client" : "192.168.91.132:45745",

  15. "desc" : "conn5",

  16. "threadId" : "0x7f1370cb4700",

  17. "connectionId" : 5,

  18. "waitingForLock" : false,

  19. "numYields" : 0,

  20. "lockStats" : {

  21. "timeLockedMicros" : {

  22. "r" : NumberLong(141),

  23. "w" : NumberLong(0)

  24. },

  25. "timeAcquiringMicros" : {

  26. "r" : NumberLong(16),

  27. "w" : NumberLong(0)

  28. }

  29. }

  30. }

  31. ]

  32. }



  33. "opid" : 6222,#进程号

  34. "active" : true,#是否活动状态

  35. "secs_running" : 3,#操作运行了多少秒

  36. "microsecs_running" : NumberLong(3662328),

  37. "op" : "getmore",#操作类型,包括(insert/query/update/remove/getmore/command)

  38. "ns" : "local.oplog.rs",#命名空间

  39. "query" : {},#如果op是查询操作,这里将显示查询内容;也有说这里显示具体的操作语句的


  40. "client" : "192.168.91.132:45745",#连接的客户端信息

  41. "desc" : "conn5",#数据库的连接信息

  42. "threadId" : "0x7f1370cb4700",#线程ID

  43. "connectionId" : 5,#数据库的连接ID

  44. "waitingForLock" : false,#是否等待获取锁

  45. "numYields" : 0,

  46. "lockStats" : {

  47. "timeLockedMicros" : {#持有的锁时间微秒

  48. "r" : NumberLong(141),#整个MongoDB实例的全局读锁

  49. "w" : NumberLong(0)},#整个MongoDB实例的全局写锁

  50. "timeAcquiringMicros" : {#为了获得锁,等待的微秒时间

  51. "r" : NumberLong(16),#整个MongoDB实例的全局读锁

  52. "w" : NumberLong(0)}#整个MongoDB实例的全局写锁



MongoDB提供了killOp请求,用于干掉运行时间很长的请求,killOp通常需要与currentOp组合起来使用;先根据currentOp查询到请求的opid,然后根据opid发送killOp的请求。

currentOp

currentOp的使用,参考官方文档

currentOp会将后端Mongod上正在执行的请求都列出来,也可根据查询条件(如请求类型,请求是否正在等待锁,请求操作的DB或collection)来进行过滤。

例1:查询所有正在等待锁的写操作

db.currentOp(   {     "waitingForLock" : true,     $or: [        { "op" : { "$in" : [ "insert", "update", "remove" ] } },        { "query.findandmodify": { $exists: true } }    ]   })

例2:查询所有操作db1并且执行时间已超过3s的请求

db.currentOp(   {     "active" : true,     "secs_running" : { "$gt" : 3 },     "ns" : /^db1\./   })

currentOp的过滤条件包括

  1. 请求操作类型,insert、update、delete…

  2. 请求对应的connectionId,threadId

  3. 请求是否正在等待锁

  4. 请求执行时间

  5. 请求操作的DB或collection

  6. 请求query的内容

killOp

currentOp的输出结果里,每个请求包含一个opid字段,有了opid,就可以发送killOp来干掉对应的请求。

db.killOp(opid)

要了解killOp的意义,需要先搞清楚几个问题

客户端到Monogd Server连接断掉后,连接上执行的请求是否会立即结束?

比如你通过mongo shell,发送了一个createIndex的请求,给某个包含1000w个文档的集合建立索引,这个请求会耗时很久,你想提前中止请求,Ctrl-C停掉了mongo shell,此时mongo shell到server的连接会关闭掉。

但后端createIndex的请求(MongoDB每个连接的请求由一个对应的线程来处理)不会立即结束,而是会一直执行下去,直到createIndex结束,给客户端发送应答时,发现连接已经关闭,然后线程才退出。

为了让createIndex早点结束,你就需要killOp来帮忙,通过currentOp找到craeteIndex请求的opid,然后发送killOp,createIndex会在下个『检查点』就结束执行,整个线程退出。

发送killOp后,请求是否会立即结束?

killOp的实现原理如下

每个连接对应的服务线程存储了一个killPending的字段,当发送killOp时,会将该字段置1;请求在执行过程中,可以通过不断的调用OperationContext::checkForInterrupt()来检查killPending是否被设置,如果被设置,则线程退出。



一个请求要支持killOp,必须在请求的处理逻辑里加上checkForInterrupt()检查点才行,否则即使发送了killOp,也只能等待请求完全处理完毕线程才会退出。

比如createIndex的处理逻辑里包含了类似如下的代码,在createIndex的循环过程中,一旦killPending被置1了,createIndex的执行可以在当前循环结束时退出。

while (!createIndexFinished) {    createIndexForOneElement();    checkForInterupt();}

所以发送killOp后,请求要执行到下一个『检查点』线程才会退出,MongoDB在很多可能耗时长的请求中,都加入了checkForInterrupt()检查点,如创建索引,repair database,mapreduce、aggregation等。

感谢各位的阅读!关于"Mongo中如何使用killOp干掉Long Running Operation"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

线程 查询 时间 检查 全局 内容 实例 检查点 正在 处理 字段 客户 客户端 类型 信息 数据 数据库 文档 更多 条件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 戴尔服务器r410增加内存条 315网络技术论坛方案 台州电脑软件开发流程八个步骤 文明重启开服务器有什么意义 怎么把数据库中某个表导出来 前端开发和软件开发的区别 随着网络技术数字技术的发展 调用数据库输出pdf文件 电话人工智能应用软件开发优点 兄弟标签打印机数据库打印 意识形态及网络安全课件 服务器主板进入bios Ei数据库如何全选数据 java抢单软件开发原理 打印服务器里删不掉打印机 服务器游戏可以注册却进不了游戏 我国网络安全法基本特点 如何查看服务器带宽数据 网络技术研发综合实训 网络安全建设以实现为目标 滴滴软件开发北京 西安爱易网络技术招聘 软件开发中用到的数学有哪些 软件开发时为什么会吵 宝德服务器bmc地址 华为elk数据库版本号 sql数据数据库 工信部公示网络安全抽查 国家卫健委网络安全课 果洛软件开发平均价格
0