用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况。本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因及其相应的解决方案。

常见原因

系统执行应用提交查询(包括数据修改操作)时需要大量的逻辑读(逻辑 IO,执行查询所需访问的表的数据行数),所以系统需要消耗大量的 CPU 资源以维护从存储系统读取到内存中的数据一致性。

说明:大量行锁冲突、行锁等待或后台任务也有可能会导致实例的 CPU 使用率过高,但这些情况出现的概率非常低,本文不做讨论。

本文通过一个简化的模型来说明系统资源、语句执行成本以及 QPS(Query Per Second 每秒执行的查询数)之间的关系:

条件:应用模型恒定(应用没有修改)。

avg_lgc_io:执行每条查询需要的平均逻辑 IO。

total_lgc_io:实例的 CPU 资源在单位时间内能够处理的逻辑 IO 总量。

关系公式:total_lgc_io = avg_lgc_io x QPS -- 单位时间 CPU 资源 = 查询执行的平均成本 x 单位时间执行的查询数量

解决方法

数据管理(DMS)工具提供了几种辅助排查并解决实例性能问题的功能,主要有:

实例诊断报告

SQL 窗口提供的查询优化建议和查看执行计划

实例会话

其中,实例诊断报告是排查和解决 MySQL 实例性能问题的最佳工具。无论何种原因导致的性能问题,建议您首先参考下实例诊断报告,尤其是诊断报告中的 SQL 优化、会话列表和慢 SQL 汇总分。

避免出现 CPU 使用率达到 100% 的一般原则

设置 CPU 使用率告警,实例 CPU 使用率保证一定的冗余度。

应用设计和开发过程中,要考虑查询的优化,遵守 MySQL 优化的一般优化原则,降低查询的逻辑 IO,提高应用可扩展性。

新功能、新模块上线前,要使用生产环境数据进行压力测试(可以考虑使用阿里云 PTS 压力测试工具)。

新功能、新模块上线前,建议使用生产环境数据进行回归测试。

建议经常关注和使用 DMS 中的诊断报告。

注意:关于如何访问 DMS 中的诊断报告,请参见 RDS 如何访问诊断报告。

典型示例

以 CPU 使用率为 100% 的典型场景为例,本文介绍了两个引起该状况的原因及其解决方案,即应用负载(QPS)高和查询执行成本(查询访问表数据行数 avg_lgc_io)高。其中,由于查询执行成本高(查询访问表数据行数多)而导致实例 CPU 使用率高是 MySQL 非常常见的问题。

应用负载(QPS)高

现象描述

特征:实例的 QPS(每秒执行的查询次数)高,查询比较简单、执行效率高、优化余地小。

表现:没有出现慢查询(或者慢查询不是主要原因),且 QPS 和 CPU 使用率曲线变化吻合。

常见场景:该状况常见于应用优化过的在线事务交易系统(例如订单系统)、高读取率的热门 Web 网站应用、第三方压力工具测试(例如 Sysbench)等。

解决方案

对于由应用负载高导致的 CPU 使用率高的状况,使用 SQL 查询进行优化的余地不大,建议您从应用架构、实例规格等方面来解决,例如:

升级实例规格,增加 CPU 资源。

增加只读实例,将对数据一致性不敏感的查询(比如商品种类查询、列车车次查询)转移到只读实例上,分担主实例压力。

使用阿里云 DRDS 产品,自动进行分库分表,将查询压力分担到多个 RDS 实例上。

使用阿里云 Memcache 或者云 Redis 产品,尽量从缓存中获取常用的查询结果,减轻 RDS 实例的压力。

对于查询数据比较静态、查询重复度高、查询结果集小于 1 MB 的应用,考虑开启查询缓存(Query Cache)。

注意:能否从开启查询缓存(Query Cache)中获益需要经过测试,具体设置请参见 RDS for MySQL 查询缓存(Query Cache)的设置和使用。

定期归档历史数据、采用分库分表或者分区的方式减小查询访问的数据量。

尽量优化查询,减少查询的执行成本(逻辑 IO,执行需要访问的表数据行数),提高应用可扩展性。

查询执行成本(查询访问表数据行数 avg_lgc_io)高

现象描述

特征:实例的 QPS(每秒执行的查询次数)不高;查询执行效率低、执行时需要扫描大量表中数据、优化余地大。

表现:存在慢查询,QPS 和 CPU 使用率曲线变化不吻合。

原因分析:由于查询执行效率低,为获得预期的结果即需要访问大量的数据(平均逻辑 IO高),在 QPS 并不高的情况下(例如网站访问量不大),就会导致实例的 CPU 使用率高。

解决方案

解决该状况的原则是:定位效率低的查询、优化查询的执行效率、降低查询执行的成本。

操作步骤

通过如下方式定位效率低的查询:

通过 show processlist; 或 show full processlist; 命令查看当前执行的查询,如下图所示:

对于查询时间长、运行状态(State 列)是“Sending data”、“Copying to tmp table”、“Copying to tmp table on disk”、“Sorting result”、“Using filesort”等都可能是有性能问题的查询(SQL)。

注意:

若在 QPS 高导致 CPU 使用率高的场景中,查询执行时间通常比较短,show processlist; 命令或实例会话中可能会不容易捕捉到当前执行的查询。您可以通过执行如下命令进行查询:

explain selectb.*fromperf_test_no_idx_01 a,perf_test_no_idx_02 b wherea.created_on >=2015-01-01anda.detail =b.detail

您可以通过执行类似 kill 101031643; 的命令来终止长时间执行的会话,终止会话请参见 RDS for MySQL 如何终止会话。关于长时间执行会话的管理,请参见 RDS for MySQL 管理长时间运行查询

通过 DMS 查看当前执行的查询,查询步骤如下:

在 DMS 控制台上登录数据库。

选择性能 > 实例会话,显示结果如下图所示:

从上图可以看出,有 10 个会话在执行下面这个查询:

selectb.*fromperf_test_no_idx_01 a,perf_test_no_idx_02 b wherea.created_on>='2015-01-01'anda.detail=b.detail;

单击 SQL 列中的查询文本,即可显示完整的查询和其执行计划,如下图所示:

从上图可以看出,在该查询的执行计划中,系统对两张约为 30 万行的数据表执行了全表扫描。由于两张表是联接操作,这个查询的执行成本(逻辑 IO)约为 298267 x 298839 = 89,133,812,013(大概 900 亿),所以查询会执行相当长的时间并且多个会话会导致实例 CPU 使用率达到 100%(对于同样规格的实例,如果是优化良好的查询,QPS 可以达到 21000;而当前 QPS 仅为 5)。

得到需要优化的查询后,可以通过如下任意一种方式来获取查询的优化建议:

通过 DMS 的优化查询获取:

注意:对于 QPS 高和查询效率低的混合模式导致的 CPU 使用率高的问题,建议使用优化查询获取优化建议。

在 DMS 控制台上登录数据库。

选择 SQL 操作 > SQL 窗口。

单击优化,即可得到优化建议,如下图所示:

通过 DMS 控制台上的诊断报告获取:

说明:诊断报告同样适用于排查历史实例 CPU 使用率高的问题。

在 DMS 控制台上登录数据库。

选择性能 > 诊断报告。

单击发起诊断,即可创建一个针对当前实例运行情况的报告,如下图所示:

单击查看报告,查看优化建议。

注意:对于 CPU 使用率高的问题,建议关注诊断报告的 SQL 优化、会话列表和慢 SQL 汇总部分。

根据优化建议,添加索引,查询执行成本就会大幅减少(如下图所示,从 900 亿行减小到 30 万行,查询成本降低 30 万倍),实例 CPU 使用率 100% 的问题解决。

mysql利用cpu率高_MySQL CPU 使用率高的原因和解决方法相关推荐

  1. mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法

    (3)MySQL的字符集设置. 这个是重点了,一般都是在这里搞错而出现了mysql乱码. mysql编码设置可以分为三种设置:数据库的编码.表的编码.和字段的编码. a.数据库的编码: 在sqlyog ...

  2. mysql表文件被删_mysql表物理文件被误删的解决方法

    前言 1.该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 2.并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm ...

  3. mysql 字符串不限长度_mysql提示字符长度超限制的解决方法

    mysql提示字符长度超限制的解决方法 发布时间:2020-06-11 16:16:16 来源:亿速云 阅读:294 作者:鸽子 mysql在创建数据库的时候,字符集设置的不是utf8而是utf9mb ...

  4. 高刷显示器变成24Hz的原因及解决方法

    分享一下我在使用显示器拓展屏时遇到的刷新率问题: 我有一块1080P 的便携显示器,平时用来拓展屏幕用的,但是最近一段时间发现了一个问题,60Hz的显示器有时只有24Hz,使用体验极差,鼠标滑动跟陷入 ...

  5. mysql2003错误_mysql出现2003错误的原因及解决方法

    一.mysql数据库没有启动 启动方法: 开始->运行->services.msc 在里面找到名称为MySQL的服务,双击打开属性,点启动. 2.使用下面的命令启动net start my ...

  6. mysql 存储微信昵称乱码_MYSQL 保存微信昵称特殊字符报错解决方法-设置编码集为utf8mb4的方法...

    mysql utf8mb4 保存微信昵称特殊字符报错方法 公众号二次开发,在处理用户昵称的时候发现有的时候一些emoji是4字节的表情无法保存入库,经过查找资料发现是因为字段的编码问题造成的, utf ...

  7. 80m的mysql文件要导入多久_mysql导入数据库文件最大限制更改解决方法:You probably tried to upload too large file...

    最近一次在用phpmyadmin导入mysql数据库时,偶的15M的数据库不能导入,mysql数据库最大只能导入2M.. phpmyadmin数据库导入出错: You probably tried t ...

  8. mysql登陆错误2003(hy000)_mysql远程无法登陆出现ERROR2003(HY000)...解决方法_MySQL

    bitsCN.com Q: 当在另一台机器上登录MySQL时出现如下错误: ERROR 2003 (HY000): Can't connect to MySQL server on 'x.x.x.x' ...

  9. mysql出现waiting_MySQL出现Waiting for table metadata lock的原因以及解决方法

    MDL简述 ​ 为了在并发环境下维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作.因此从MySQL5.5版本开始引入了MDL锁(metadata lock), ...

  10. mysql connection is read-only._Connection is read-only问题的产生原因与解决方法

    经过 1.项目中运用了MySQL存储过程中使用动态行转列,使用了存储过程. 2.定义的service接口名为: /** * 根据参数查询业绩目标列表 * @param pageNo * @param ...

最新文章

  1. 最大数值(不能使用比较运算符)
  2. vim 直接跳转到标签
  3. 微信小程序开发 使用高德地图(精准一些)
  4. excel如何在双引号里面引用变量
  5. JAVA后端面试100 QA之第一篇
  6. VMware 虚拟机优化十招
  7. string字符串数字自增_常见的字符串操作
  8. 容器技术Docker K8s 30 容器服务ACK基础与进阶-弹性伸缩
  9. aix系统服务器日志外发,AIX系统日志
  10. 软件工程(英文版 第8版)
  11. 简单matlab插值函数
  12. Spark应用提交后一直不运行:hadoop-yarn ACCEPTED: waiting for AM container to be allocated, launched and registe
  13. win7找回快速启动栏
  14. Open Explorer Plugin for Eclipse (eclipse 插件 在ecli
  15. 一个看漫画、看资讯、逛论坛、听歌的神器,务必吃下这颗安利!
  16. element el-table 在IE浏览器 表头失效问题
  17. android平板 视频输入,安卓平板电脑的新突破口:HDMI in 视频输入,取代便携显示器...
  18. pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)
  19. 我的世界pe服务器坐标怎么显示,我的世界手机版坐标怎么看 PE版没有MOD怎么查看坐标...
  20. 异常处理 ?处理(try-catch) :甩锅(throws)_ java异常(Exception)处理

热门文章

  1. Linux常用命令之scp
  2. RGB_打开/获取颜色选择器(RGB)的几种方式/本地RGB查询/css颜色名参考
  3. 网络相关面试题及思考(HTTP类)
  4. 我的世界中国版服务器账号封了,Hypixel中国版服务器停止运营公告
  5. Dreamwear如何创建javascript_内存管理+如何处理4种常见的内存泄漏
  6. 我越脱俗,就会越世俗
  7. 美图手机怎么投屏到电脑
  8. 树莓派?云服务器?小主机?旧手机使用Termux安卓手机中跑Java跑spring boot不香吗?
  9. 华夏ERP没有找到新增功能
  10. Linux电源管理(2)_Generic PM之基本概念和软件架构(蜗窝科技,www.wowotech.net)