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


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

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

  • 实例诊断报告

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

  • 实例会话

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

另外,如果您需要阿里云的技术支持来解决 CPU 使用率高的状况,请参见 https://market.aliyun.com/store/1682301.html。

RDS 如何访问诊断报告。

RDS for MySQL 查询缓存(Query Cache)的设置和使用。

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

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

  • RDS for MySQL 如何终止会话。关于长时间执行会话的管理,请参见 RDS for MySQL 管理长时间运行查询
  • 通过 DMS 查看当前执行的查询,查询步骤如下:

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

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

      DMS 查看执行的查询

      从上图可以看出,有 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)。

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

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

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

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

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

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

        优化查询

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

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

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

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

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

        诊断报告

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

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

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

    优化结果