MySQL数据库慢–排查问题总结(整理自《抽丝剥茧之MySQL疑难杂症排查》叶金荣)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

1、常见瓶颈

  (1)SQL效率低

  2)选项配置不当

  3)访问题飙升

  4)硬件性能低

  5)其他进程抢资源

2、怎样确认是MySQL存在瓶颈

   top/free/vmstat/sar/mpstat确认

   —确认mysqld进程的CPU消耗占比

   —确认mysqld进程的CPU消耗是%user,还是%sys

   —确认是否物理内存不够用了

   —确认是否有swap产生

   —确认CPU上是否有大量中断(或中断不均)

2.1、查看CPU—top

25541478146213.jpg


2.2、查看内存—free

free -m

69121478146213.jpg


free相关命令

37061478146213.png

2.3、查看IO、CPU、内存、交换分区、中断—vmstat

vmstat -S m 1

24971478146214.jpg

从上面可以看出,CPUI/O的压力都不算小

输出结果说明:

vmstat 命令的解释:

1procs

r这一列显示了多少进程正在等待CPU

b列显示了多少进程正在不可中断地休眠(通常意味着它们在等待I/O,例如磁盘、网络、用户输入、等等)。

2memory

swpd 虚拟内存已使用的大小(显示多少块被换出到了磁盘(页面交换)),如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free   空闲的物理内存的大小

buff  多少块正在被用作缓冲  

cache 多少正在被用作操作系统的缓存

3swap显示页面交换活动:每秒有多少块正在被换入(从磁盘)和换出(到磁盘)

si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。

so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

一般情况下,siso的值都为0,如果siso的值长期不为0,则表示系统内存不足,需要考虑是否增加系统内存。

4IO显示有多少块从块设备读取(bi)和写出(bo

bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0bibo一般都要接近0,不然就是IO过于频繁,需要调整。

这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。

5system显示了每秒中断(in)和上下文切换(cs)的数量

in 每秒CPU的中断次数,包括时间中断

cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

上面这两个值越大,会看到内核消耗的CPU时间就越多。

6CPU

us 用户CPU时间。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了

sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。

id  空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wa 等待IO CPU时间。

Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

st列一般不关注,虚拟机占用的时间百分比

2.4、查看CPU及IO–sar

查看CPU

sar -u 1


20211478146214.jpg

输出项说明:

CPUall 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

%nice:通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

1.  %iowait 的值过高,表示硬盘存在I/O瓶颈

2.  %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量

3.  %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 

查看IO状态

26991478146214.jpg

tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.

rd_sec/s:每秒读扇区的次数.

wr_sec/s:每秒写扇区的次数.

avgrq-sz:平均每次设备I/O操作的数据大小(扇区).

avgqu-sz:磁盘请求队列的平均长度.

await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1=1000毫秒).

svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.

%util:I/O请求占CPU的百分比,比率越大,说明越饱和.

1. avgqu-sz 的值较低时,设备的利用率较高。

2. %util的值接近 1% 时,表示设备带宽已经占满。

2.5、查看中断情况

mpstat -P ALL -I SUM 1 100

26621478146214.png

3、查看MySQL在干嘛

3.1、显示哪些线程正在运行

show processlist;show full processlist

状态一、Sending data

mysql> show processlist\G

11361478146214.png

从以上可以看出是长时间的sending data

Sending data:表示从引擎层读取数据返回给Server端的状态

长时间存在原因:

(1)     没适当的索引,查询效率低

(2)     读取大量数据,读取缓慢

(3)     系统负载高,读取缓慢

解决方法:

(1)     加上合适的索引

(2)     或者改写SQL,提高效率

(3)     增加LIMIT限制每次读取数据量

(4)     检查&升级I/O设备性能

状态二、Waiting for table metadata lock

show processlist;show full processlist

77471478146214.jpg

从以上可以看出:长时间等待MDL

原因:

(1)     DDL被阻塞,进而阻塞他后续SQL

(2)     DDL之前的SQL长时间未结束

解决方法:

(1)     提高每个SQL的效率

(2)     干掉长时间运行的SQL

(3)     DDL放在半夜等低谷时段

(4)     采用pt-osc执行DDL

状态三、Sleep

84171478146214.png

从以上可以看出:Sleep

看似无害,实则可能是大害虫

(1)     占用连接数

(2)     消耗内存未释放

(3)     可能有行锁(甚至是表锁)未释放

解决方法:

(1)     适当调低timeout

(2)     主动Kill超时不活跃连接

(3)     定期检查锁、锁等待

(4)     可以利用pt-kill工具

状态四:其他状态

(1)状态:Copy to tmp table

原因:

 1)执行alter table 修改表结构,需要生成临时表

 2)建议放在夜间低谷执行,或者用pt-osc

(2)Copying to tmp table [on disk]

 Creating tmp table

 常见于group by 没有索引的情况

 需要拷贝数据到临时表[内存/磁盘上]

 执行计划中会出现Using temporary关键字

 建议创建合适的索引,消除临时表

(3) Creating sort index

常见于order by 没有索引的情况

需要进行filesort排序

执行计划中会出现Using filesort关键字

建议创建排序索引

(4)其他状态

Waiting for global read lock

Waiting for query cache lock

Waiting for table level lock

Waiting for table metadata lock

3.2、查看锁– mysql锁排查过程

mysql> select * from information_schema.innodb_trx;

mysql> select * from information_schema.innodb_locks;

查看锁等待

mysql> select * from information_schema.innodb_lock_waits;

mysql> select * from sys.innodb_lock_waits; 

mysql锁排查过程

1)查看当前锁等待的情况

INNODB_TRX的锁情况:

mysql> SELECT  * FROM INNODB_TRX\G;

2)查看锁等待和持有锁的相互关系

mysql> SELECT * FROM INNODB_LOCK_WAITS\G;

3)查看锁等待的原因

mysql> SELECT * FROM INNODB_LOCKS\G;

3.3、查看Innodb的状态

show engine innodb status\G

查看MySQL线程状态

3.4、查看慢日志

4、如何预防

4.1、业务上线前

1)提前消灭垃圾SQL,

2)在开发或压测环境中

  调底long_query_time的值,甚至设为0

  开启log_queries_not_using_indexes

  分析slow query log,并消除潜在隐患SQL

4.2、用更好的设务

  1CPU更快更多核

  2)内存更快更大

  3)用更快的I/O设备

  4)用更好的网络设备

4.3、磁盘文件系统及调度算法

(1)采用xfs/ext4文件系统

2)采用noop/deading io scheduler



本文转自 corasql 51CTO博客,原文链接:http://blog.51cto.com/corasql/1906155,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL 关系型数据库 MySQL
MySQL如何排查和删除重复数据
该文章介绍了在MySQL中如何排查和删除重复数据的方法,包括通过组合字段生成唯一标识符以及使用子查询和聚合函数来定位并删除重复记录的具体步骤。
21 2
|
11天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
13天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
138 11
|
8天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
49 13
MySQL的安装&数据库的简单操作
|
14天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
4天前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
18 4
|
12天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
27 2
|
15天前
|
存储 缓存 关系型数据库
MySQL 视图:数据库中的灵活利器
视图是数据库中的虚拟表,由一个或多个表的数据经筛选、聚合等操作生成。它不实际存储数据,而是动态从基础表中获取。视图可简化数据访问、增强安全性、提供数据独立性、实现可重用性并提高性能,是管理数据库数据的有效工具。
|
15天前
|
SQL 关系型数据库 MySQL
MySQL技术安装配置、数据库与表的设计、数据操作解析
MySQL,作为最流行的关系型数据库管理系统之一,在WEB应用领域中占据着举足轻重的地位。本文将从MySQL的基本概念、安装配置、数据库与表的设计、数据操作解析,并通过具体的代码示例展示如何在实际项目中应用MySQL。
53 0
|
1月前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
157 2

热门文章

最新文章