通过自治服务解决MySQL实例CPU使用率过高的问题

本文将介绍如何使用数据库自治服务DAS(Database Autonomy Service)(原CloudDBA)来定位系统中的慢SQL和其它异常SQL语句,您可通过自治服务提供的建议优化这些SQL语句,降低实例的CPU使用率以提升系统效率。

问题描述

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

问题原因

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

  • 使数据库产生大量的逻辑读,从而导致CPU使用率过高。

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

说明

关于逻辑读和物理读的相关介绍,请参见更多信息

解决方案

说明

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

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

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏中,选择自治服务(原CloudDBA) > 慢SQL

  3. 选择要查询的时间,单击确定

    说明

    目前只支持显示最近1个月内的慢SQL数据。

  4. 若实例中有慢SQL,图示中会以图的方式显示慢SQL产生的时间点和个数。单击图中的时间点,下方的列表就会显示其对应的所有慢SQL信息。

    image

  5. 如何分析慢SQL。

    重点关注慢日志明细中的返回行和扫描行的值。每条SQL语句都有很多扫描行数但返回行数都为0,说明系统产生了大量的逻辑读和物理读。产生物理读是因为内存大小有限,不可能缓存所有数据,当有大量数据请求时必然会产生大量物理I/O请求。大量的逻辑读会占用大量的CPU资源,导致CPU使用率上涨。

  6. 单击SQL栏中的SQL语句,查看该SQL语句的详情。

  7. 单击SQL优化建议,即可查看CloudDBA给该SQL语句提出的优化建议。

    从下图的分析结果可以看出,该SQL语句执行时缺少对应的索引,导致执行该语句时要全表扫描。另外,根据MySQL的数据更新机制,每次执行该语句时整个表格都会被锁,进而使问题更加严重。凡是执行该语句的session都会出现排队等待的状况,单次执行成本又极高,所以就很容易导致CPU使用率较高甚至达到100%的状况。

  8. 根据优化建议优化异常SQL语句,CPU使用率过高的问题就会随之而解。

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

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

说明

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

更多信息

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

image

相关文档

RDS MySQL慢日志分析

适用于

云数据库RDS MySQL