文档首页 > > 最佳实践> MySQL> 排查RDS for MySQL CPU使用率高的原因和解决方法

排查RDS for MySQL CPU使用率高的原因和解决方法

分享
更新时间:2020/08/18 GMT+08:00

使用云数据库MySQL时,如果您的CPU使用率很高或接近100%,会导致数据读写处理缓慢、无法获取连接、出现报错等,从而影响业务正常运行。

解决方法一

分析慢SQL日志(如果有)以及CPU使用率指标来定位效率低的查询,再优化查询效率低的语句。

  1. 查看慢SQL日志来确定是否存在运行缓慢的SQL查询以及各个查询的性能特征(如果有),从而定位查询运行缓慢的原因。

    查询MySQL日志,请参见慢查询日志

  2. 查看华为云关系型数据库实例的CPU使用率指标,协助定位问题。

    请参见通过Cloud Eye监控

  3. 创建只读实例专门负责查询。减轻主实例负载,分担数据库压力。
  4. 多表关联查询时,关联字段要加上索引。
  5. 尽量避免用select*语句进行全表扫描,可以指定字段或者添加where条件。

解决方法二

分析当前数据库运行线程来定位效率低的查询,再通过华为云数据管理服务(Data Admin Service,简称DAS)提供的建议优化这些SQL语句来降低实例的CPU使用率以提升系统效率。

  1. 连接MySQL实例。

    具体操作请参见《关系型数据库快速入门》,通过内网和公网连接实例的内容。

  2. 执行以下命令,查看当前执行操作,定位效率低的查询。

    show full processlist

    *************************** 1. row ***************************
                      Id: 16193
                    User: rdsAdmin
                    Host: localhost
                      db: NULL
                 Command: Query
                    Time: 0
                   State: starting
                    Info: show full processlist
             Memory_used: 16424
    Memory_used_by_query: 8208
                CPU_time: 294611
       Trx_Executed_Time: 0
       logical_page_read: 0
          disk_page_read: 0
        iops_limit_count: 0
    *************************** 2. row ***************************
                      Id: 16246
                    User: root
                    Host: ********
                      db: test04_1
                 Command: Query
                    Time: 36
                   State: creating table
                    Info: create table test04_1.table_test_7(a int, b varchar(21632))
             Memory_used: 151378
    Memory_used_by_query: 8208
                CPU_time: 128329
       Trx_Executed_Time: 0
       logical_page_read: 57
          disk_page_read: 0
        iops_limit_count: 0
    *************************** 3. row ***************************
                      Id: 16247
                    User: root
                    Host: ********
                      db: test01_1
                 Command: Query
                    Time: 36
                   State: creating table
                    Info: create table test01_1.table_test_7(a int, b varchar(21632))
             Memory_used: 151378
    Memory_used_by_query: 8208
                CPU_time: 127529
       Trx_Executed_Time: 0
       logical_page_read: 0
          disk_page_read: 0
        iops_limit_count: 0
    *************************** 4. row ***************************
                      Id: 16261
                    User: root
                    Host: ********
                      db: test05_1
                 Command: Query
                    Time: 16
                   State: creating table
                    Info: create table test05_1.table_test_6(a int, b varchar(21632))
             Memory_used: 151378
    Memory_used_by_query: 8208
                CPU_time: 150650
       Trx_Executed_Time: 0
       logical_page_read: 0
          disk_page_read: 0
        iops_limit_count: 0
    *************************** 5. row ***************************
                      Id: 16262
                    User: root
                    Host: ********
                      db: test_1
                 Command: Query
                    Time: 14
                   State: creating table
                    Info: create table test_1.table_test_5838(a int, b varchar(21632))
             Memory_used: 151376
    Memory_used_by_query: 8208
                CPU_time: 179596
       Trx_Executed_Time: 0
       logical_page_read: 0
          disk_page_read: 0
        iops_limit_count: 0
    *************************** 6. row ***************************
                      Id: 16266
                    User: root
                    Host: ********
                      db: test02_1
                 Command: Query
                    Time: 8
                   State: creating table
                    Info: create table test02_1.table_test_9(a int, b varchar(21632))
             Memory_used: 151378
    Memory_used_by_query: 8208
                CPU_time: 154582
       Trx_Executed_Time: 0
       logical_page_read: 0
          disk_page_read: 0
        iops_limit_count: 0
    *************************** 7. row ***************************
                      Id: 16269
                    User: root
                    Host: ********
                      db: test03_1
                 Command: Query
                    Time: 6
                   State: creating table
                    Info: create table test03_1.table_test_11(a int, b varchar(21632))
             Memory_used: 151378
    Memory_used_by_query: 8208
                CPU_time: 153918
       Trx_Executed_Time: 0
       logical_page_read: 0
          disk_page_read: 0
        iops_limit_count: 0
    7 rows in set (0.00 sec)

  3. 得到需要优化的查询后,您可以使用华为云数据管理服务(Data Admin Service,简称DAS),通过SQL诊断查询,您可获知资源消耗大、执行耗时长、执行次数频繁的SQL语句。可根据诊断建议进行优化,保持数据库性能的稳定性。

    1. 登录到数据管理服务控制台。
    2. 在顶部菜单栏选择“SQL窗口”>“SQL诊断”,进入SQL诊断页面。
      图1 SQL诊断-1
    3. 在SQL诊断页面,单击“新增SQL性能诊断”,新增SQL诊断任务。在新增SQL性能诊断弹出框中,您根据实际需要选择输入SQL语句或者上传SQL文件,然后单击“确定”,完成创建SQL诊断任务。
      图2 SQL诊断-2
      图3 SQL诊断-3
    4. 在SQL诊断列表页面,您可选择“数据库”“日期范围”单击“搜索”,进行筛选诊断报告。在诊断列表中,您可在“操作”栏查看诊断详情。
      图4 SQL诊断任务查询

      在SQL诊断详情页面,您可了解本次诊断任务的基本信息、诊断状态预览、诊断列表,并查看SQL列表中SQL诊断详情内容,获取语句优化建议等信息。

      图5 SQL诊断详情
      图6 诊断详情
      • SQL诊断功能会获取相关表结构和数据分布信息(非原始数据),该信息仅用于诊断逻辑,不会存储到DAS服务器。
      • 获取表结构和数据分布信息的过程中,可能会对实例带来额外负载,但对性能影响甚微。
      • SQL诊断历史是唯一存储在DAS服务器上的数据,如果执行删除操作后,也将彻底从服务器上删除。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问