本文介绍如何查看消耗内存高的事件和线程,为您解决内存相关问题提供参考。
内存是重要的性能参数,内存使用率过高会导致系统响应速度变慢,严重时内存耗尽实例会进行主备切换,导致业务中断。因此我们需要在内存异常升高时及时排查问题,避免影响业务。
前提条件
实例版本如下:
MySQL 5.7
MySQL 8.0
操作步骤
登录RDS管理控制台。
在页面左上角,选择实例所在地域。
找到目标实例,单击实例ID。
在左侧导航栏中单击参数设置。
修改参数performance_schema为ON,如果已经为ON请忽略此步骤。
说明该操作会重启实例造成连接中断,重启前请做好业务安排,谨慎操作。
单击,修改值为ON,单击确定。
单击右上角提交参数,等待实例重启完成。
使用DMS或客户端通过命令行、客户端连接RDS MySQL实例。
重要请使用高权限账号连接RDS MySQL实例。
执行如下命令打开内存监控:
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;
说明该命令是在线打开内存统计,所以只会统计打开后新增的内存对象,打开前的内存对象不会统计,建议您打开后等待一段时间再执行后续步骤,便于找出内存使用高的线程。
您可以执行命令统计事件和线程的内存消耗量,并进行排序展示。
统计事件消耗内存:
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;
统计线程消耗内存:
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;
说明您也可以执行如下命令查看详细的监控信息:
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
下一步
找到问题事件或线程后,您可以排查业务代码和环境,解决内存高的问题。
文档内容是否对您有帮助?