DAY22 MongoDB Profiler 几个指令抓出拖垮系统的元凶

DAY22 MongoDB Profiler 几个指令抓出拖垮系统的元凶

Profiler 查询推荐指令

db.system.profile.find()

一般我们不会这样做,因为资讯又多又难阅读,可以加上一些查询条件。
例如 limit(x) 或者指定某些操作 op 等等。
以下直接推荐我常在使用的指令:

直接找出最慢的

利用执行时间、倒序来找出最慢的几个。
为了方便阅读也加入.limit().pretty()语法,後面就不赘述。

db.system.profile.find().sort({ millis: -1 }).limit(5).pretty();

利用操作类别查询

如果你确定慢的 op 是什麽,也可以针对 op 直接排序。

db.system.profile.find({"op":"query"}).sort({ millis: -1 });

查询是否有 COLLSCAN

db.system.profile.find({"planSummary": "COLLSCAN"});

利用发生时间来查询

有设定好最低可接受的执行时间门槛的话,可以用这个方法定期检查是否有新增慢的查询。

db.system.profile.find().sort({ ts: -1 });

查询特定时间区

db.system.profile.find({
"ts": {
         $gt: new ISODate("2021-06-13T00:00:00Z"),
         $lt: new ISODate("2021-06-13T03:00:00Z")
    }}).sort({ millis: -1 });

查询特定Collection

db.system.profile.find({ ns: 'target.collection' });

查找过多文件的查询

db.system.profile.find({ docsExamined: { $gt : 10000 }}).sort({ ts: -1 });

profile size

profile 在系统是有预设 1 Mb 的大小,如果要改变,必须先关闭、删除现有 profile、重建最後重新开起。因此强烈建议在服务开启之前就先决定好。

指令如下:


// 1 停用
db.setProfilingLevel(0)

// 2.删除 (回传为 true/false)
db.system.profile.drop()

// 3.重建 (回传为 {"ok": 1})
db.createCollection("system.profile", {capped: true, size: 3000000})

// 4.重开
db.setProfilingLevel(1)

心得

其实在查找效能低落的操作,会用到的指令大概就是这些了,蛮考验的是对各个参数的熟悉度。
第一阶段是了解各个参数,第二阶段是定期自动化取得 profile 内容,第三阶段是配合自定义的规则来告警,要做到自动化还是需要时间与资源的投入。

问题爆发通常是在线上环境,但你敢在线上环境开profiler吗?

如果在开发阶段就开着 profiler,执行测试後都有回报其结果,就能减少不该存在的操作一路上到正式环境。(举个最简单例子,定期察看是否有 Collection scan 就帮助很大了)

有的人反对开 profiler 会慢,但会慢多少?开着 level 1 也有过滤杂讯的功能,我再测试了一下影响并不显着,况且开发环境从来就不是效能测试的地方,另外就是它是存在 capped collection,实在不用太担心效能影响剧烈的状况。

以上我说的是正式营运环境之前建议可以开。


本系列文章会同步发表於我个人的部落格 Pie Note


<<:  [DAY7] 手起刀落

>>:  DAY 9:Worker Pool Pattern,就。很。Pool。

Day29 人物骨架 - 瞄准动作篇

本篇文章的Unreal engine 4 版本为 4.25.3 认识了骨架之後当然要让角色动起来,因...

Day 28 | 很像 Vue 的 AlpineJS(三): x-model

昨天还少讲了一个最最最常用到的 x-model。如同他的样子,跟 v-model、wire:mode...

Day02. 走出户外,来到巨人的脚下-免费注册个BP来玩玩吧!

《荀子》一书的第二十三篇《性恶篇》提到:「坐而言,不如起而力行。」 疫情期间,因公司分流上班,每天都...

DAY04 - 套件?手刻?都挤~?

在前端打滚一段时间 主要都是在用element UI这个UI套件在制作网站後台 因此对套件的依赖非常...

Day1 写程序的前置工作!

安装环境第一步骤 App Store 搜寻Xcode并下载 下载後并创立一个专案 进入後系统帮我们预...