前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一次 MongoDB 占用 CPU 过高问题的排查

记一次 MongoDB 占用 CPU 过高问题的排查

作者头像
拓荒者
发布2019-08-29 17:25:49
5.8K0
发布2019-08-29 17:25:49
举报
文章被收录于专栏:运维经验分享运维经验分享

引言

今天查看监控无意间突然发现自己的服务器上,CPU 占用率飙升到 100%,load 升到 10 以上,登录的响应已经达到半分钟

马上运行 top,发现主要是 mongodb 占用了大量的 CPU,这是为什么呢?又该如何解决呢?

分析正在执行的请求

通过运行命令:

1

db.currentOp()

我们可以看到数据库当前正在执行的操作:

官方文档

https://docs.mongodb.com/manual/reference/method/db.currentOp/?spm=a2c4e.11153940.blogcont73389.10.2c402b90x4iad1

包含信息

主要有以下信息:

  • client -- 请求是由哪个客户端发起的
  • opid -- 操作的opid,有需要的话,可以通过 db.killOp(opid) 杀死操作
  • secs_running/microsecs_running -- 请求运行的时间,如果这个值特别大就非常值得注意
  • query/ns: 对集合进行的具体操作
  • lock*:锁相关参数

开启慢请求日志

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

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

通过命令开启

推荐在生产环境中设置为 1,开启慢请求日志,方便问题的暴露和排查,可以通过下面命令设置 profiling 级别:

1

db.setProfilingLevel(1, { slowms: 20 })

{ slowms: 20 } 参数就是慢请求执行阈值,单位是毫秒

通过配置文件开启

也可以通过配置文件开启:

1

2

3

operationProfiling:

mode: slowOp

slowOpThresholdMs: 100

查看慢请求记录

下面的命令中我们获取了最近的3条慢请求记录:

1

db.system.profile.find().sort({$natrual: -1}).limit(3)

慢请求分析 -- 全表扫描 COLLSCAN

如果在日志中看到关键字 COLLSCAN,说明该查询在进行全表扫描,通常这就是 CPU 异常飙高的主要原因

查看扫描文档数

system.profile 里 docsExamined 的值显示了本次查询的扫描文档数

解决办法 -- 添加索引

最好针对查询语句建立索引:

1

db.col.createIndex({"title":1})

我们也可以在添加索引时增加传入可选参数,例如,在生产环境我们通常不希望索引添加的操作阻塞其他数据库操作,这时就需要务必添加 background 参数:

1

db.col.createIndex({"title":1}, {'background', true})

慢请求分析 -- 索引设置不合理

有的时候,请求即使查询走了索引,执行也很慢,通常是因为索引建立不太合理或者匹配结果太多

索引通常应该建立在区分度大的字段上

在 system.profile 中,可以通过 keysExamined 字段查看查询扫描了多少条索引,如果该值过大,要考虑建立新的索引或优化查询了

慢请求分析 -- 大量数据排序

当查询请求里包含排序的时候,如果排序无法通过索引满足,MongoDB 会在内存中对结果进行排序

大家都知道,排序是非常消耗 CPU 的一项操作,最好在需要排序的字段上建立索引

system.profile 中的 SORT 关键字反映了查询需要排序

服务能力评估

有时 CPU 消耗过高仅仅是单纯的因为服务器达到了上限

如果上面的措施都无法让 CPU 占用率下降到合理的指标内,就要考虑扩容、升级来提升服务能力的上限

但切忌将这个方法作为首要考虑的解决方案,合理的设置索引,建立资源预警,而不是盲目提升配置或在业务已经达到上限时再考虑优化

参考资料

https://docs.mongodb.com/manual/reference/method/db.currentOp/?spm=a2c4e.11153940.blogcont73389.10.2c402b90x4iad1

https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/?spm=a2c4e.11153940.blogcont73389.11.2c402b90x4iad1

https://docs.mongodb.com/manual/reference/database-profiler/?spm=a2c4e.11153940.blogcont73389.13.2c402b90WPcbsr

https://yq.aliyun.com/articles/73389

http://www.runoob.com/mongodb/mongodb-indexing.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 分析正在执行的请求
    • 官方文档
      • 包含信息
      • 开启慢请求日志
        • 通过命令开启
          • 通过配置文件开启
            • 查看慢请求记录
            • 慢请求分析 -- 全表扫描 COLLSCAN
              • 查看扫描文档数
                • 解决办法 -- 添加索引
                • 慢请求分析 -- 索引设置不合理
                • 慢请求分析 -- 大量数据排序
                • 服务能力评估
                • 参考资料
                相关产品与服务
                云数据库 MongoDB
                腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档