MongoDb CPU利用率过高问题如何解决
在公司的项目中,突然出现过一个情况,mongodb 的CPU利用率到达100%,导致服务器这边卡死了,请求了半天无响应,提示请求超时。
因为,当时APP用户可能会在某一个时间段集中的使用,所以,请求量一下子就飙上去了,刚好APP打开请求的时候,有一个mongodb的请求。
当时因为Mongodb的服务器不在我们这边,所以一下子没反应过来,不过最后还是给排除出,并解决了。这里就来记录下排查和解决的全过程。
问题分析:
1.根据代码,定位到了是Mongodb的报错。
2.进入Mongodb 服务器的监控后台,这里是在阿里云购买的云缓存。
3.知道是Mongodb出问题,就好办了,阿里云里面有个索引推荐,很好用的,会给出查询时间,执行次数,和推荐策略
OK,这里准备工作就基本做完了。
解决策略:
1.根据这些给出的执行次数,和执行时间慢的,去看了下库。从设计上,有问题,一个库有900W的数据,然后集合逻辑看了下,这库只往里面存数据,从不清理
2.没有建立过索引,包括单一索引和连接索引,这也是会导致慢的一个原因。优化后是这样的,
db.getCollection('course_study_history').createIndex({'studentId':1,'contentStudyID':1,'courseWareID':1,'courseStudyId':1})
3.一个查询总数的方法有问题,下面是修改后的JAVA方法:
MongoCollection<Document> collection = database.getCollection(pushMessageCollection); long cNt = collection.count(Filters.and(Filters.eq("userId", userId), Filters.eq("sendType", sendType), Filters.eq("message_read", "0")));
最开始的写法,大概就类型,Mysql 里,查询某个list,然后list.size(),得出总数,
修改后的方法:大概就相当于 count(id) 得出总数,
这样的话,修改后的方法,肯定就会比修改前的快。
方案基本决定下来了,实施后开始压力测试。
没修改时的2000并发:
修改后的2000并发:
可以看到时间,也明显的提高了。
并且测试4000 并发,虽然慢了,不过没崩掉。
再查看CPU信息,没有出现100%的情况了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Centos7 yum安装mongodb实现步骤详解
简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自由 :可以把不同结构的文档存储在同一个数据库里 面向集合的存储:适合存储 JSON风格文件的形式 完整的索引支持:对任何属性可索引 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制.复制的主要目的是提供冗余及自动故障转移 自动分片:支持云级别的伸缩性:自动分片功能支持水
-
vs2019 下用 vb.net编写窗体程序连接 mongodb4.2的方法
说起来,查看Mongodb官方的接口文档是场噩梦,尽管mongodb官方花了大力气整顿了它的API,但是简单的接口罗列,0代码示范,让人无从开始.幸亏有很多天才,成功破译,我才得以沿着他们走的路,照猫画虎的走下去.整个项目结构如下: 类文件中vbtest.vb数据库实体类对应着mongodb文档vbtest,用于数据操作测试 Imports MongoDB.Bson Public Class vbtest Public _id As ObjectId Public content As Stri
-
MongoDB 用户管理
小小最近接触了MongoDB,所以这里开始学习MongoDB,之用户管理模块的相关内容. 进入MongoDB的Shell 这里输入如下的命令,进入MongoDB的shell mongo 切换数据库 use admin 使用如上的命令,切换数据库到admin数据库. 创建超级管理员用户 创建超级管理员权限的用户 db.createUser( { user: "admin", customData:{description:"superuser"}, pwd: &quo
-
.Net Core使用MongoDB的详细教程
前言 MongoDB 是由C++语言编写的,是一个基于分布式且面向文档存储的开源数据库系统. 下载地址: https://www.mongodb.com/download-center/community 在.Net Core中使用需要引入核心包 MongoDB.Driver 添加数据: //与Mongodb建立连接 MongoClient client = new MongoClient("mongodb://127.0.0.1"); //获得数据库,没有则自动创建 IMongoDa
-
MongoDB如何查看版本信息详解
下面总结一下,如何查看MongoDB的版本信息 1:连接到MongoDB,使用命令查看. > db.version(); 4.0.0 > 2:mongo命令查看 相对路径使用mongo命令 # ./mongo --version MongoDB shell version v4.0.0 git version: 3b07af3d4f471ae89e8186d33bbb1d5259597d51 OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013 al
-
mongodb 4.0副本集搭建的全过程
前言 近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1. 准备工作 1.1 下载软件 选择版本并下载mongodb的软件,注意操作系统版本等.本次我选用的是percona分支的mongodb 4.2.8版本搭建,操作系统为centos6 cd /usr/local/ wget https://www.percona.com/downloads/percona-server-mongodb-
-
开源 5 款超好用的数据库 GUI 带你玩转 MongoDB、Redis、SQL 数据库(推荐)
工欲善其事必先利其器,想要玩溜数据库,不妨去试试本文安利的 5 款开源的数据库管理工具.除了流行的 SQL 类数据库--MySQL.PostgreSQL 之外,文档型数据库 MongoDB.内存数据库 Redis 的管理工具也在列表之中. MongoDB 图形化的管理工具:Mongood GitHub Star 数 :222 Mongood 是一个 MongoDB 图形化的管理工具.
-
Linux安装MongoDB启动及常见问题解决
MongoDB安装过程以及问题记录 一.MongoDB安装 下载MongoDB 官方地址:https://www.mongodb.com/download-center/community 可能需要注册一下我这里是Centos7系统所以选择的是RHEL7.0的TGZ,其他系统自行选择 如果不想注册在这里下载也可以:https://www.mongodb.org/dl/linux 下载步骤: [root@localhost ~]# curl -O https://fastdl.mongodb.or
-
MongoDb CPU利用率过高问题如何解决
在公司的项目中,突然出现过一个情况,mongodb 的CPU利用率到达100%,导致服务器这边卡死了,请求了半天无响应,提示请求超时. 因为,当时APP用户可能会在某一个时间段集中的使用,所以,请求量一下子就飙上去了,刚好APP打开请求的时候,有一个mongodb的请求. 当时因为Mongodb的服务器不在我们这边,所以一下子没反应过来,不过最后还是给排除出,并解决了.这里就来记录下排查和解决的全过程. 问题分析: 1.根据代码,定位到了是Mongodb的报错. 2.进入Mongodb 服务器的
-
java应用cpu占用过高问题分析及解决方法
使用jstack分析java程序cpu占用率过高的问题 1,使用jps查找出java进程的pid,如3707 2,使用top -p 14292 -H观察该进程中所有线程的CPU占用. [root@cp01-game-dudai-0100.cp01.baidu.com ~]# top -p 14292 -H top - 22:14:13 up 33 days, 7:29, 4 users, load average: 25.68, 32.11, 33.76 Tasks: 113 total, 2
-
java实战CPU占用过高问题的排查及解决
最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID top 2.通过ps aux | grep PID命令 获取线程信息,并找到占用CPU高的线程 ps -mp pid -o THREAD,tid,time | sort -rn 3.将需要的线程ID转换为16进制格式 printf "%x\n" tid 4.打印线程的堆栈信息 到了这一步具体看堆栈的日
-
解决正则表示式匹配($regex)引起的一次mongo数据库cpu占用率高的问题
某一天,监控到mongo数据库cpu使用率高了很多,查了一下,发现是下面这种语句引起的: db.example_collection.find({ "idField" : { "$regex" : "123456789012345678" } , "dateField" : { "$regex" : "2019/10/10" }}) 通常,遇到这种情况,我第一反应是缺少相关字段的索引,导
-
Java进程cpu占用过高问题解决
cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,则是100%:我们应该意识到,cpu运行速度很快(主频非常高),除非密集型耗费cpu的运算,其它类型任务都会在小于时间片的时间内结束. 产生CPU100%的原因: 某一程序一直占用CPU是导致CPU100%的原因,大概有以下几种情况: 1.Java 内存不够或溢出导致GC overhead问题, GC ove
-
python和bash统计CPU利用率的方法
本文实例讲述了python和bash统计CPU利用率的方法.分享给大家供大家参考.具体如下: 开始的时候写了一个 bash 的实现: 因为最近也在学习 python ,所以就尝试着用 python 再实现一回: 支援 python2 环境: 请各位给予下建议,有什么改良的地方可以提一下,不甚感激: Python代码如下: #!/usr/bin/python # -*- coding:utf8 -*- __author__ = 'chenwx' def cpu_rate(): import tim
-
Mongodb 副本集搭建问题总结及解决办法
Mongodb 副本集搭建问题总结及解决办法 Mongodb数据库的副本集是由多台服务器组成,基中一台是主节点,其它为从节点,如果主节点宕机就自动切换到任意一个从节点.如果以前的主节点修复完成和正常运行就自动变成从节点,从节点不能查询数据.也可以在一台服务器装多个Mongodb端口不一样. 在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天主要负责
-
CPU占用率高的N种原因
1.防杀毒软件造成故障 由于新版的KV.金山.瑞星都加入了对网页.插件.邮件的随机监控,无疑增大了系统负担.处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务吧,或者,升级你的硬件配备. 2.驱动没有经过认证,造成CPU资源占用100% 大量的测试版的驱动在网上泛滥,造成了难以发现的故障原因. 处理方式:尤其是显卡驱动特别要注意,建议使用微软认证的或由官方发布的驱动,并且严格核对型号.版本. 3.病毒.木马造成 大量的蠕虫病毒在系统内部迅速复制,造成CPU占用资源率据高不下.解决办法:用
-
MongoDB磁盘IO问题的3种解决方法
IO概念 在数据库优化和存储规划过程中,总会提到IO的一些重要概念,在这里就详细记录一下,对这个概念的熟悉程度也决定了对数据库与存储优化的理解程度,以下这些概念并非权威文档,权威程度肯定就不能说了. 读/写IO,最为常见说法,读IO,就是发指令,从磁盘读取某段扇区的内容.指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读,还是写.磁盘收到这条指令,就会按照指令的要求,读或者写数据.控制器发出的这种指令+数据,就是一次IO,读或者写. 大/小块IO,
-
一个正则表达式导致CPU 利用率居高不下
前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%.通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息. 藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下 我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处.通过排查代码,我们知道这个方法的主要功能是校验 URL 是否合法. 很奇怪,一个正则表达式怎么会导致 CPU 利用率居高不下.为了弄
随机推荐
- BAT文件语法和技巧(bat文件的编写及使用)
- CSS网页布局入门教程8:三列浮动中间列宽度自适应
- 强制设为首页代码
- VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
- document.compatMode介绍
- WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
- php 去除html标记--strip_tags与htmlspecialchars的区别详解
- MySql 5.5.29绿色安装教程详解
- php实现读取内存顺序号
- Python中利用sorted()函数排序的简单教程
- 利用RJB在Ruby on Rails中使用Java代码的教程
- SqlServer 2005 T-SQL Query 学习笔记(1)
- SQL普通表转分区表的方法
- js实现用滚动条来放大缩小图片的代码
- JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
- Android ViewPager的事件冲突的解决办法
- Hibernate映射文件id的generator配置方法
- java自定义封装StringUtils常用工具类
- vue :src 文件路径错误问题的解决方法
- python Django中models进行模糊查询的示例