问题描述

2020年7月13日一大早收到告警,测试环境数据库CPU告警。
登录aws查看监控如下图

 

问题分析

出现这种cpu 100%的问题,都是因为sql性能问题导致的,
主要表现于 cpu 消耗过大,有慢sql造成、慢sql全表扫描,扫描数据库过大,内存排序,队列等等
并发现写入相对于查询来说比较高(这是一个关键点)
有了大概的思路下边开始排查吧
 
查看进程
show full processlist;


发现有大量的语句状态为 sending data
sending data: sql正从表中查询数据,如果查询条件没有适当索引,会导致sql执行时间过长。
 
查看慢日志配置
mysql> show variables like 'slow_query%';
+---------------------+----------------------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /rdsdbdata/log/slowquery/mysql-slowquery.log |
+---------------------+----------------------------------------------+
2 rows in set
mysql> show variables like 'slow_launch_time';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| slow_launch_time | 1 |
+------------------+-------+
1 row in set
看到慢日志已经开启
登录aws cloudwatch查看慢日志发现大部分为这条sql
# User@Host: admin[admin] @  [10.0.11.12]  Id:  2302
# Query_time: 3.602910 Lock_time: 0.100585 Rows_sent: 2 Rows_examined: 4454
SET timestamp=1594629311;
SELECT a.enum_value,a.bsh_enum_value
FROM external_mapping a
LEFT JOIN external_bsh_command_key b ON a.bsh_command_id=b.id
LEFT JOIN external_bsh_command_options c ON a.bsh_options_id=c.id
LEFT JOIN external_command_key d ON a.command_id=d.id
LEFT JOIN category h ON a.category_id=h.id
where 1=1
AND b.code='BSH.Common.Status.Event'
AND c.code='BSH.Common.Setting.Rm4Valve'
AND d.code='Rm4_Valve'
AND a.platform_id=119
AND h.cname = 'TT';
 
查看是否有锁表
mysql> show OPEN TABLES where In_use > 0;
#查看是否有锁表
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
#查看正在锁的事务
Empty set
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
#查看等待锁的事务
Empty set
暂时没有看到锁表的情况
 
查看缓存命中
mysql> show global status like 'Qca%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 134199912 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 44950579 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+-----------+
8 rows in set
说明:
Qcache_hits:查询缓存命中次数。
Qcache_inserts:将查询和结果集写入到查询缓存中的次数。
Qcache_not_cached:不可以缓存的查询次数。
Qcache_queries_in_cache:查询缓存中缓存的查询量。
查看到缓存命中为0%
 
查看引擎状态
mysql> show engine innodb status;
通过上边一系列的查询,发现以下几个问题
1、慢查询、全表扫描过多
描述
慢sql:查看到sql语句执行时间过长。
全表扫描:这个策略用于检查百分比((Handler_read_rnd+Handler_read_rnd_next)/(Handler_read_first+Handler_read_key+Handler_read_next+Handler_read_prev+Handler_read_rnd+Handler_read_rnd_next))。 这是一个需要读取全表内容的操作,而不是仅读取使用索引选定的部分。 通常使用小型查找表执行,或者在具有大型表的数据仓库情况下执行而其中所有可用数据都被聚合和分析。
建议
慢sql:根据sql 检查语句并进行索引优化。
全表扫描:应该尽量保持这个值尽可能的低。尝试隔离那些不使用索引的查询。一旦识别了那些查询,请创建适当的索引或重写查询以使用索引。MySQL 有一个很棒的功能 - 慢速查询日志,它允许你记录所有需要超过指定时间运行的查询。慢速速查询日志可用于识别需要很长时间才能完成的查询。
 
2、数据库最大并发连接数量
描述
当服务器启动后,(max_used_connections)变量将提供一个基准,以帮助你确定服务器支持的最大连接数量。 它还可以帮助进行流量分析。
建议
如果需要支持更多的连接,应该增加变量 max_connections 的值。MySQL 支持的最大连接数量是取决于给定平台上线程库的质量、可用 RAM 的数量、每个连接可使用多少 RAM、每个连接的工作负载以及所需的响应时间。
 
3、查询缓存要配置
缓存描述
这个策略用于检查查询缓存命中率(Qcache_hits/(Qcache_hits + Com_select))。 MySQL 查询缓存将缓存一个分析的查询及其整个结果集。 当你有许多小型的查询返回小型数据集时,这是非常好的,因为查询缓存将允许返回结果立即可供使用,而不是每次发生时都重新运行查询。
建议
理想情况下,查询缓存的命中率应该接近 100%。MySQL 的查询缓存是一项强大的技术,并且在管理良好的情况下可以显着提高数据库的吞吐量。一旦你的应用程序被创建,你可以看看它如何使用数据库,并相应地调整查询缓存。有足够大的缓存,避免碎片化和排除大型的查询,你就应该能够保持极高的缓存命中率,并享受出色的性能。
 

处理过程

根据上边发现的问题进行了配置的修改

1、修改慢查询以及全表扫描

此问题联系开发进行索引优化,减少全表扫描。

2、数据库最大连接数量

修改配置 max_user_connections 我这边设置的为1000

3、查询缓存的配置

参数说明
query_cache_size:分配用于缓存查询结果的内存量。
query_cache_limit:不要缓存大于此字节数的结果。
query_cache_type:对于查询结果,不缓存(= OFF),不缓存NO_CACHE(= ON),或仅缓存(= DEMAND)分别用012 表示
 
修改完数据但是需要重启才能生效。
 

问题解决

正在准备空闲时间重启RDS的时候,开发那边有了进展。
开发同事把缓存写错了。
理下业务
程序暴露接口给测试部门,测试部门在上报了50W条数据,开发这边程序有没有添加数据过滤(过滤掉垃圾数据),并且...开发在程序中写错了缓存。所以导致相对于读取来说写入较高。因为在缓存查询不到想到的数据,就进行了全表扫描,继而出现了大量进程以及连接数队列等等。。

总结

处理问题可以,别主动背锅。。。在接手数据库的时候最好检查下配置,了解数据库的情况,在出现问题的时候能够最快速的定位解决问题。
另外,经过此次的故障处理,加固了对业务以及数据库一些参数的理解。
 

数据库CPU 100%处理记录的更多相关文章

  1. 【故障公告】数据库服务器 CPU 100% 引发网站故障

    悄悄地它又突然来了 -- 数据库服务器 CPU 100% 问题,上次光临时间是 3-30 8:48,这次是 4-28 9:41. 这次我们做出了快速反应,发现后立即进行主备切换,这次一次切换成功,CP ...

  2. 记录一次MySQL数据库CPU负载异常高的问题

    1.起因 某日下午18:40开始,接收到滕讯云短信报警,显示数据库CPU使用率已超过100%,同时慢查询日志的条数有1500条左右. 正常情况下:CPU使用率为30%-40%之间,慢查询日志条数为0. ...

  3. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

  4. 【故障公告】阿里云 RDS 数据库服务器 CPU 100% 造成全站故障

    非常非常抱歉,今晚 19:34 ~ 21:16 园子所使用的阿里云 RDS 数据库服务器突然出现 CPU 100% 问题,造成全站无法正常访问,由此您带来了很大的麻烦,请您谅解. 故障经过是这样的.1 ...

  5. 【故障公告】访问高峰数据库服务器 CPU 100% 引发全站故障

    今天上午11:10,我们又中"奖"了,我们使用的阿里云 RDS 实例(SQL Server 2016 标准版,16核32G)突发出现 CPU 100%,引发全站故障,直到 12:1 ...

  6. 【故障公告】阿里云 RDS SQL Server 数据库实例 CPU 100% 引发全站故障

    非常抱歉,今天 8:48 开始,我们使用的阿里云 RDS SQL Server 数据库实例突然出现 CPU 100%  问题,引发全站故障,由此给您带来麻烦,请您谅解. 发现故障后立即进行主备切换,和 ...

  7. 【故障公告】数据库服务器再次 CPU 100% 引发全站故障

    今天五一劳动节的一大早 5:50-6:30 期间,我们使用的阿里云 RDS SQL Server 数据库实例再次出现 CPU 100% 问题,引发全站故障,由此给您带来麻烦,请您谅解. 我们发现故障后 ...

  8. 【故障公告】数据库服务器 CPU 100% 引发全站故障

    今天 11:12-12:03 期间,园子使用的阿里云 RDS 实例(SQL Server2016 标准版,16核CPU)出现 CPU 100% 问题,引发全站故障,由此给您带来麻烦,请您谅解. 发现故 ...

  9. 记录一次数据库CPU被打满的排查过程

    1 前言 近期随着数据量的增长,数据库CPU使用率100%报警频繁起来.第一个想到的就是慢Sql,我们对未合理运用索引的表加入索引后,问题依然没有得到解决,深入排查时,发现在 order by id ...

随机推荐

  1. java正则匹配字符串例子

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class sss { public static void ...

  2. 说说Java异步调用的几种方式

    日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结果就对原服务进行返回.这里就涉及的Java异步调用的一个知识.下面本文尝试将Java异步调用的多种方式进行 ...

  3. DevOps基础的认识与工具实践

    什么是DevOps DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快.更频繁地交付更稳定的软件 Devops 包含了敏捷开发,测试,运维 DevO ...

  4. vue菜单切换

    HTML: <div id="box"> <ul> <li v-for= "(item,index) in arry"> & ...

  5. 授予mysql的其他用户数据库的使用权限

    场景:不同的开发人员有不同的数据库的权限:也可适用于外包公司不同的开发权限. root用户登录数据库,命令行执行下面语句即可. grant select,delete,update,create,dr ...

  6. S3C2440—1.熟悉裸机开发板

    文章目录 一.板载资源介绍 二.安装驱动及上位机 1.USB的驱动及上位机 2.eop驱动安装 3.安装烧录软件oflash 三.烧写开发板 1.预备知识 2.烧写裸板 3.使用u-boot烧写程序 ...

  7. Django静态文件配置 request对象 Django操作MySQL

    Django中的文件介绍 render.HttpResponse和redirect 当我们想起手写一个项目,创建好应用并且注册之后,在urls.py文件先导入app文件夹下migrations下的vi ...

  8. mybaits进阶01

    在以上mybait入门的改进(增加了接口让增删改查 后期跟容易) 注意:主配置文件和映射配置文件内容不变,但是映射文件要和对应接口放于同目录下并且名称必须相同 一.接口创建 public interf ...

  9. 《手把手教你》系列技巧篇(二十一)-java+ selenium自动化测试-浏览器窗口的句柄(详细教程)

    1.简介 今天本来就要分享和讲解三大延时等待的,但是在写作过程中发了问题,会用到这一个知识点,于是就提前介绍一下,以便后边用到了可以更好的理解和掌握.本文就是要介绍如何获得浏览器窗体的句柄或者叫编号, ...

  10. GitNote基于git的个人云笔记

    优点 可以存储到git服务(如github,giteee)中的能看到历史版本的git记事本工具. git 是一个很棒的工具,GitNote 支持 git 的全部特性,并且不依赖本地 Git 环境. 你 ...