RDS for MySQL如何查看消耗内存高的事件和线程

RDS for MySQL如何查看消耗内存高的事件和线程

概述

本文介绍如何查看消耗内存高的事件和线程,为您解决内存相关问题提供参考。

 

详细信息

内存是重要的性能参数,内存使用率过高会导致系统响应速度变慢,严重时内存会耗尽,实例会进行主备切换,导致业务中断。因此我们需要在内存异常升高时及时排查问题,避免影响业务。

  1. 登录RDS管理控制台,在页面左上角,选择实例所在地域。
    选择地域
  2. 找到目标实例,单击实例ID。在左侧导航栏中单击 参数设置
  3. 将performance_schema参数值修改为ON,如果已经为ON请忽略此步骤。
    提示:该操作会重启实例,造成连接中断,重启前请做好业务安排,谨慎操作。
    1. 单击performance_schema参数右侧的修改按钮,将值修改为ON,然后单击 确定
    2. 单击页面右上角 提交参数,等待实例重启完成即可。
  4. 使用DMS或客户端连接MySQL实例,依次执行如下SQL语句,打开内存监控。
    update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';
    select * from performance_schema.setup_instruments where name like 'memory%innodb%' limit 5;
    注:该命令是在线打开内存统计,所以只会统计打开后新增的内存对象,打开前的内存对象不会统计,建议您打开后等待一段时间再执行后续步骤,便于找出内存使用高的线程。
  5. 您可以参考如下SQL语句统计事件和线程的内存消耗量,并进行排序展示。
    1. 统计事件消耗内存。
      select event_name,
           SUM_NUMBER_OF_BYTES_ALLOC
      from performance_schema.memory_summary_global_by_event_name
      order by SUM_NUMBER_OF_BYTES_ALLOC desc
      LIMIT 10;
      系统显示类似如下。
    2. 统计线程消耗内存。
      select thread_id,
           event_name,
           SUM_NUMBER_OF_BYTES_ALLOC
      from performance_schema.memory_summary_by_thread_by_event_name
      order by SUM_NUMBER_OF_BYTES_ALLOC desc
      limit 20;
      系统显示类似如下。
  6. 您也可以参考如下SQL语句,查看详细的监控信息。
    select * from sys.x$memory_by_host_by_current_bytes;
    select * from sys.x$memory_by_thread_by_current_bytes;
    select * from sys.x$memory_by_user_by_current_bytes;
    select * from sys.x$memory_global_by_current_bytes;
    select * from sys.x$memory_global_total;
    select * from performance_schema.memory_summary_by_account_by_event_name;
    select * from performance_schema.memory_summary_by_host_by_event_name;
    select * from performance_schema.memory_summary_by_thread_by_event_name;
    select * from performance_schema.memory_summary_by_user_by_event_name;
    select * from performance_schema.memory_summary_global_by_event_name;
    select event_name,
           current_alloc
    from sys.memory_global_by_current_bytes
    where event_name like '%innodb%';
    select event_name,current_alloc from sys.memory_global_by_current_bytes limit 5;
    select m.thread_id tid,
           USER,
           esc.DIGEST_TEXT,
           total_allocated
    FROM sys.memory_by_thread_by_current_bytes m,
         performance_schema.events_statements_current esc
    WHERE m.`thread_id` = esc.THREAD_ID \G
  7. 找到问题事件或线程后,您可以排查业务代码和环境,解决内存高的问题。

 

适用于

  • 云数据库 RDS MySQL 版
    注:仅适用于MySQL 5.7和MySQL 8.0的版本。