全部产品
云市场
云游戏
    利用CloudDBA解决MySQL实例CPU使用率过高的问题

利用CloudDBA解决MySQL实例CPU使用率过高的问题

更新时间:2020-08-05 15:39:43

问题描述

在使用云数据库RDS MySQL版的过程中,经常会因CPU使用率过高而导致的系统异常,例如响应变慢、无法获取连接和出现报错等。

问题原因

在CPU使用率过高的场景中,有95%以上的问题都是由异常SQL所致。当业务提交的SQL语句不够优化时,就会对数据库的性能产生如下影响。另外,大量行锁冲突、行锁等待或后台任务也有可能导致实例CPU使用率过高,但这些状况出现的概率非常低,本文不做讨论。

  • 使数据库产生大量的逻辑读,从而导致CPU使用率过高。
  • 使数据库产生大量的物理读,从而导致IOPS和I/O延时过高。

说明:有关逻辑读和物理读的相关介绍请参见更多信息

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

本文将主要介绍如何使用RDS的CloudDBA功能来定位系统中的慢SQL和其它异常SQL语句,然后您可通过CloudDBA提供的建议优化这些SQL语句,降低实例的CPU使用率以提升系统效率。

使用SQL诊断功能排查异常SQL语句

  1. 登录RDS管理控制台,选择目标实例所在地域。
  2. 单击目标实例ID,进入基本信息页面。
  3. 在左侧导航栏的CloudDBA中,选择慢SQL,进入慢SQL页面。
  4. 选择要查询的时间,然后单击确定
    说明:目前只支持显示最近1个月内的慢SQL数据。
  5. 若实例中有慢SQL,图示中会以图的方式显示慢SQL产生的时间点和个数。单击图中的时间点,下方的列表就会显示其对应的所有慢SQL信息。
  6. 如何分析慢SQL。重点关注慢日志明细中的返回行和扫描行的值。每条SQL语句都有很多扫描行数但返回行数都为0,说明系统产生了大量的逻辑读和物理读。产生物理读是因为内存大小有限,不可能缓存所有数据,当有大量数据请求时必然会产生大量物理I/O请求。大量的逻辑读会占用大量的CPU资源,导致CPU使用率上涨。
  7. 单击SQL栏中的SQL语句,查看该SQL语句的详情。
  8. 单击SQL优化建议,即可查看CloudDBA给该SQL语句提出的优化建议。从下图的分析结果可以看出,该SQL语句执行时缺少对应的索引,导致执行该语句时要全表扫描。另外,根据MySQL的数据更新机制,每次执行该语句时整个表格都会被锁,进而使问题更加严重。凡是执行该语句的session都会出现排队等待的状况,单次执行成本又极高,所以就很容易导致CPU使用率较高甚至达到100%的状况。
  9. 根据优化建议优化异常SQL语句,CPU使用率过高的问题就会随之而解。

使用SQL统计功能排查异常SQL语句

若使用SQL统计功能排查异常SQL语句,请参见使用方法

注意:SQL审计需另外计费,为节约成本,您可以在查看数据库SQL语句前开通SQL审计,然后待问题排查完毕后再关闭该功能。

更多信息

数据库中的数据是以数据块为基本操作单位,一个MySQL数据块是8KB,一次逻辑读或物理读对应一个数据块的读取操作。当数据库执行业务查询语句(包括数据修改操作)时,CPU会先从内存中请求数据块。如果内存中有对应的数据,CPU执行计算任务后,将结果返回给用户。如果内存中没有对应的数据,系统会触发从磁盘读取数据的操作。这两个数据获取过程分别是逻辑读和物理读,如下图所示。

适用于

  • 云数据库RDS

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。