分析MongoDB数据库的慢请求

云数据库MongoDB默认开启了慢请求Profiling ,系统自动地将请求时间超过100ms的执行情况记录到对应数据库下的system.profile集合里。

通过use 命令进入指定数据库。 use mongodbtest

执行如下命令,查看该数据下的慢请求日志。 db.system.profile.find().pretty()

分析慢请求日志,查找引起MongoDB CPU使用率升高的原因。

以下为某个慢请求日志示例,可查看到该请求进行了全表扫描,扫描了11000000个文档,没有通过索引进行查询。 {

"op" : "query",

"ns" : "123.testCollection",

"command" : {

"find" : "testCollection",

"filter" : {

"name" : "zhangsan"

},

"$db" : "123"

},

"keysExamined" : 0,

"docsExamined" : 11000000,

"cursorExhausted" : true,

"numYield" : 85977,

"nreturned" : 0,

"locks" : {

"Global" : {

"acquireCount" : {

"r" : NumberLong(85978)

}

},

"Database" : {

"acquireCount" : {

"r" : NumberLong(85978)

}

},

"Collection" : {

"acquireCount" : {

"r" : NumberLong(85978)

}

}

},

"responseLength" : 232,

"protocol" : "op_command",

"millis" : 19428,

"planSummary" : "COLLSCAN",

"execStats" : {

"stage" : "COLLSCAN",

"filter" : {

"name" : {

"$eq" : "zhangsan"

}

},

"nReturned" : 0,

"executionTimeMillisEstimate" : 18233,

"works" : 11000002,

"advanced" : 0,

"needTime" : 11000001,

"needYield" : 0,

"saveState" : 85977,

"restoreState" : 85977,

"isEOF" : 1,

"invalidates" : 0,

"direction" : "forward",

....in"

}

],

"user" : "root@admin"

}

通常在慢请求日志中,您需要重点关注以下几点。

全表扫描(关键字: COLLSCAN、 docsExamined )

全集合(表)扫描COLLSCAN 。

当一个操作请求(如查询、更新、删除等)需要全表扫描时,将非常占用CPU资源。在查看慢请求日志时发现COLLSCAN关键字,很可能是这些查询占用了CPU资源。

说明 如果这种请求比较频繁,建议对查询的字段建立索引的方式来优化。

通过查看docsExamined的值,可以查看到一个查询扫描了多少文档。该值越大,请求所占用的CPU开销越大。

不合理的索引(关键字: IXSCAN、keysExamined )

说明

索引不是越多越好,索引过多会影响写入、更新的性能。

如果您的应用偏向于写操作,索引可能会影响性能。

通过查看keysExamined字段,可以查看到一个使用了索引的查询,扫描了多少条索引。该值越大,CPU开销越大。

如果索引建立的不太合理,或者是匹配的结果很多。这样即使使用索引,请求开销也不会优化很多,执行的速度也会很慢。

如下所示,假设某个集合的数据,x字段取值的重复率很高(假设只有1、2),而y字段取值的重复率很低。{ x: 1, y: 1 }

{ x: 1, y: 2 }

{ x: 1, y: 3 }

......

{ x: 1, y: 100000}

{ x: 2, y: 1 }

{ x: 2, y: 2 }

{ x: 2, y: 3 }

......

{ x: 1, y: 100000}

要实现 {x: 1, y: 2} 这样的查询。db.createIndex( {x: 1} ) 效果不好,因为x相同取值太多

db.createIndex( {x: 1, y: 1} ) 效果不好,因为x相同取值太多

db.createIndex( {y: 1 } ) 效果好,因为y相同取值很少

db.createIndex( {y: 1, x: 1 } ) 效果好,因为y相同取值少

关于{y: 1} 与 {y: 1, x: 1} 的区别,可参见

大量数据排序(关键字: SORT、hasSortStage )

当查询请求里包含排序的时候, system.profile 集合里的hasSortStage字段会为 true 。如果排序无法通过索引满足,MongoDB会在查询结果中进行排序。而排序这个动作将非常消耗CPU资源,这种情况需要对经常排序的字段建立索引的方式进行优化。

说明 当您在system.profile集合里发现SORT关键字时,可以考虑通过索引来优化排序。

其他还有诸如建立索引、aggregation(遍历、查询、更新、排序等动作的组合) 等操作也可能非常耗CPU资源,但本质上也是上述几种场景。更多profiling的设置请参见

您也可以将MongoDB实例接入至数据库自治服务DAS(Database Autonomy Service)。在DAS控制台中,您可以对MongoDB实例的实时性能、实时会话、慢日志、磁盘空间等信息进行监控和管理,详情请参见

cpu占用高 mongo_排查MongoDB CPU使用率高的问题相关推荐

  1. 解决排查 mongodb cpu使用率过高

    前言 通过 top 命令,可以看到 MongoDB 的 CPU 使用率过高,CPU 过高会导致数据读写.处理异常缓慢,还会出现被系统抹杀进程的风险,这个问题 99.9999% 的可能性是用户使用上不合 ...

  2. 排查MongoDB CPU使用率高的问题

    MongoDB CPU使用率很高或者CPU使用率接近100%的问题,从而导致数据读写处理异常缓慢. 打开Mongo Shell 执行db.currentOp()命令,查看数据库当前正在执行的操作. { ...

  3. 计算机的cpu占用到多少会卡,CPU占用100%!PC卡顿原来可以这么解决:多场景多任务也流畅...

    现代生活里,不论是工作还是生活,多开软件和处理事务可以说都是家常便饭的事情.7cc显卡之家 一边玩着醉心已久的游戏,一边解压着新的电影和游戏:为了查询资料,一不小心打开了数十个网页:7cc显卡之家 复 ...

  4. Kafka CPU使用率高排查思路及解决方案

    一.CPU使用率高的一般排查思路 1) top命令排查CPU使用率高的进程 2) su - omm切换到omm用户,jstack -l 进程pid>>文件路径 3) top -H -p 进 ...

  5. 如何排查CPU占用过高以及常见的几种情况

    在最近上线过程中遇到cpu占用率过高问题 由于问题已解决,此时仅重现操作方法 1.先用top命令,找到cpu占用最高的进程 PID  如上图 2.再用ps -mp pid -o THREAD,tid, ...

  6. java应用 cpu占用过高问题分析及解决方法

    主要介绍了java应用cpu占用过高问题分析及解决方法,具有一定参考价值,需要的朋友可以参考下. 使用jstack分析java程序cpu占用率过高的问题 1,使用jps查找出java进程的pid,如3 ...

  7. VMware Linux虚拟机CPU占用过高

    VMware Linux虚拟机CPU占用过高 虚拟机内存占用过高是一个巨大的问题,之前已经讲过,而CPU占用过高更是重上加重,今天就来讲讲CPU占用过高的解决方法 CPU占用过高其实很简单,总共有两个 ...

  8. Windows10LTSC wsapp 高CPU占用

    今天脑子一热,在虚拟机中安装了Windows10LTSC主要因为这个是微软官方精简版本.心想使用精简版本使用起来更流畅. 镜像下载 我是从这篇文章中的链接下载的. https://zhuanlan.z ...

  9. Linux查看CPU信息(CPU个数、核心数、CPU使用率、运行位数)

    1.查看cpu的方法 cat /proc/cpuinfo 2.查看内存使用 free -m total:表示物理,内存总量 used:总计分配给缓存(包含Buffer和cache)使用的数量,但其中可 ...

最新文章

  1. Python源码学习:Python类机制分析
  2. 什么是StackOverflowError?
  3. eclipse 导出项目到 android studio .so 库
  4. libxml/xmlversion.h: No such file or directory
  5. java版DVD影碟片出租赁系统C/S模式 java电影购票系统课程设计
  6. python算法与数据结构-数据结构中常用树的介绍
  7. Windows 下用 SecureCRT 连接 VirtualBox 中的 Ubuntu
  8. java生成数据库设计说明书(excel)
  9. Bailian2720 大象喝水【模拟】
  10. find命令结合exec和xargs使用的区别
  11. FileZilla Server + FlashFXP 快速傻瓜式搭建FTP服务
  12. LABjs、RequireJS、SeaJS 哪个最好用?为什么?
  13. Vue3格式化Volar报错
  14. 机器学习入门——简单线性回归
  15. sp_helpfile
  16. android studio一个好看的字体设置
  17. navigationBar的控制
  18. Python爬虫11-Scrapy爬虫框架
  19. 关于java.util.concurrent.RejectedExecutionException: event executor terminated
  20. 【BZOJ1124】Mafia(POI2008)-环套树DP

热门文章

  1. mongodb java and or,【MongoDB】-Java实现对mongodb的And、Or、In操作
  2. mysql orderitems_【Mysql】教程全解(三)ORDER BY 排序
  3. Spring AOP之公共的切入点配置
  4. Response to preflight request doesn‘t pass access control check: The value of the ‘Access-Control-Al
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的员工事物管理系统
  6. 基于JAVA+SpringBoot+Mybatis+MYSQL的足球联赛管理系统
  7. python-基础学习篇(一)
  8. vue-router vue路由
  9. 【转】s3c2440 按键驱动 — 字符设备
  10. poj1182食物链(种类并查集)