MySQL CPU 使用率高的原因和解决方法

更新时间:2017-03-17 13:25:52   分享:

用户在使用 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 使用率高的状况,请参见 https://market.aliyun.com/store/1682301.html。

避免出现 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 使用率高。

解决方案

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

操作步骤
  1. 通过如下方式定位效率低的查询:

    • 通过 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; 命令或实例会话中可能会不容易捕捉到当前执行的查询。您可以通过执行如下命令进行查询:

                 
        1. explain select b.* from perf_test_no_idx_01 a, perf_test_no_idx_02 b where a.created_on >= 2015-01-01 and a.detail = b.detail
      • 您可以通过执行类似 kill 101031643; 的命令来终止长时间执行的会话,终止会话请参见 RDS for MySQL 如何终止会话。关于长时间执行会话的管理,请参见 RDS for MySQL 管理长时间运行查询
    • 通过 DMS 查看当前执行的查询,查询步骤如下:

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

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

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

                
        1. select b.* from perf_test_no_idx_01 a, perf_test_no_idx_02 b where a.created_on>= '2015-01-01' and a.detail= b.detail;
      3. 单击 SQL 列中的查询文本,即可显示完整的查询和其执行计划,如下图所示:

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

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

    • 通过 DMS 的优化查询获取:

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

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

      2. 选择 SQL 操作 > SQL 窗口。

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

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

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

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

      2. 选择性能 > 诊断报告。

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

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

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

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

本文导读目录

本文导读目录
  • 常见原因
  • 解决方法
  • 避免出现 CPU 使用率达到 100% 的一般原则
  • 典型示例

MySQL CPU 使用率高的原因和解决方法(来自aliyun官方文档)相关推荐

  1. mysql cpu 高 原因 汇总_MySQL CPU 使用率高的原因和解决方法(来自aliyun官方文档)

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

  2. MySQL CPU 使用率高的原因和解决方法

    MySQL CPU 使用率高的原因和解决方法 参考文章: (1)MySQL CPU 使用率高的原因和解决方法 (2)https://www.cnblogs.com/wyy123/p/9258513.h ...

  3. mysql利用cpu率高_MySQL CPU 使用率高的原因和解决方法

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

  4. mysql iops_MySQL实例IOPS使用率高的原因和解决方法

    问题描述 MySQL实例在日常使用中会出现实例IOPS使用率高的情况,本文将介绍造成该状况的主要原因和解决方法. 问题原因 实例内存满足不了缓存数据或排序等需要,导致产生大量的物理IO. 查询执行效率 ...

  5. MySQL 实例空间使用率过高的原因和解决方法

    MySQL 实例空间使用率过高的原因和解决方法 参考文章: (1)MySQL 实例空间使用率过高的原因和解决方法 (2)https://www.cnblogs.com/drizzle-xu/p/ali ...

  6. 排查mysql CPU使用率高

    最近发现mysql CPU使用率高,将排查步骤记录一下 一.top命令 找到PID为24319 二.vmstat 1 查看一下CPU使用率 三.pidstat -u 查看一下CPU使用率 ​四.pid ...

  7. CPU占用100%原因及解决方法

    CPU占用100%原因及解决方法 我们在使用Windows XP操作系统的时候,用着用着系统就变慢了,一看"任务管理器"才发现CPU占用达到100%.这是怎么回事情呢?遇到病毒了, ...

  8. win10关闭快速启动_内存占用率过高怎么办?Win10电脑内存占用率很高的原因和解决方法...

    内存占用率过高,是电脑十分常见的电脑故障,出现的现象就是什么软件还没有打开,内存占用了70%以上,甚至是99%,出现电脑明显卡顿的问题.不过想要解决内存占用率高不是简单的事情,因为可能性比较多,可能是 ...

  9. Mysql 数据库锁表的原因和解决方法

    Mysql 数据库锁表的原因和解决方法 参考文章: (1)Mysql 数据库锁表的原因和解决方法 (2)https://www.cnblogs.com/xinruyi/p/11108795.html ...

最新文章

  1. 计算机删除qq用户信息吗,电脑中删除qq资料生日性别的方法
  2. 随机重命名MP3文件
  3. Android进程退出的方法
  4. 库对比工具mysqldiff使用
  5. c 用mysql导出xls文件怎么打开_mysql——xls表格的导出和导入(重点)
  6. 50:树中两个结点的最低公共祖先
  7. 配置hibernate根据实体类自动建表功能
  8. ubuntu14操作系统chrome标签和书签乱码解决
  9. jquery城市选择案例
  10. zabbix监控TCP连接状态
  11. 201671010133 2016-2017-2 《java程序设计》 初学java!
  12. 计算机程序员证书限制条件,高级程序员考试报名条件有什么限制?
  13. windows11彻底关闭Microsoft Defender 安装注册机
  14. 雨听 | iOS快捷指令之免费观看全网免费视频
  15. Mugeda(木疙瘩)H5案例课—重力感应类H5-岑远科-专题视频课程
  16. RTB广告大数据时代 人才奇缺培养迫在眉睫
  17. 奋斗吧之“和loser对话”小故事
  18. html 引入gif 不会动,GIF图片在电脑上不会动的解决办法
  19. 使用 JAVA Swing 构建 Sftp 桌面连接工具
  20. Mac新手入门以及常用软件推荐

热门文章

  1. 聊聊Java的单元测试
  2. 招聘 | 上海交通大学医学院附属精神卫生中心诚招科研助理
  3. 任务6 -传统机器学习--SVM
  4. John和《Mamma Mia》
  5. 【pwnable.kr】leg
  6. 全球各国城镇人口数量(1960-2019年)
  7. 罗永浩重返科技圈,却故人难寻
  8. 与DB某学校的联zha考chuan(11.1)(鸽巢+乱搞+x^2的转化)
  9. CRM销售系统价格 CRM销售管理系统需要多少钱
  10. python bootstrap-fileinput示例_文件上传控件bootstrap-fileinput的使用