很多时候我们看到mysql数据库内存用的很高,这个时候我们应该如何知道mysqld进程究竟什么原因消耗掉内存的,都用哪里去了呢?下面介绍几个mysql数据库常用的查看内存消耗情况的命令~ top -p mysqlpid -H 然后使用pmap -d 分析一下进程的内存情况 1、共享内存 共享内存中的内存空间是实例创建时即分配的内存空间,并且是所有连接共享的。 全局共享内容主要是MySQL Instance以及底层存储引擎用来暂存各种全局运算及可共享的暂存信息,如 等等。 参数说明: 2、Session 私有内存 一般数据库出现 OOM 异常的实例都是由于下面各个连接私有的内存造成的。 执行如下命令查询 session 私有内存分配情况: 参数说明: 1、查看InnoDB缓冲池当前实际使用了多少GB内存 通过将缓冲池中可用的数据与InnoDB页面(InnoDB缓冲池单位)大小相乘,可以计算InnoDB缓冲池此时正在使用的实际内存。从MySQL 5.7.6开始,GLOBAL_STATUS表中提供的信息从Performance Schema获取。 2、通过InnoDB缓冲池包含数据的页数来判断 value = Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total * 100% value > 95% 则考虑增大 innodb_buffer_pool_size, 建议使用物理内存的75% value < 95% 则考虑减小 innodb_buffer_pool_size, 建议设置为:Innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 / (1024*1024*1024) MySQL 5.7的P_S(performance_schema的简称)集成了这样的功能,帮助我们分别从账号(包含授权主机信息)、主机、线程、用户(不包含授权主机信息)、整体全局等多个角度查看内存消耗统计。 1、查看全局内存消耗 2、查看哪些线程消耗比较多内存 3、哪些账号占用过多内存 4、哪些host请求占用过多内存 5、哪些用户占用过多内存 大家还有其他观察内存消耗的方法可以在下方留言一起讨论哦~ 后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下~概述
一、linux观察mysql线程内存消耗情况
二、查看mysql实例内存具体分配情况
show variables where variable_name in ( 'innodb_buffer_pool_size','innodb_log_buffer_size','innodb_additional_mem_pool_size','key_buffer_size','query_cache_size' );
show variables where variable_name in ('read_buffer_size','read_rnd_buffer_size','sort_buffer_size','join_buffer_size','binlog_cache_size','tmp_table_size');
三、innodb缓冲池内存消耗情况
set @ibpdata = (select variable_value from performance_schema.global_status where variable_name = 'innodb_buffer_pool_pages_data');
select @ibpdata;
set @idbpgsize = (select variable_value from performance_schema.global_status where variable_name = 'innodb_page_size');
select @idbpgsize;
set @ibpsize = @ibpdata * @idbpgsize / (1024*1024*1024);
select @ibpsize;
2、通过InnoDB缓冲池包含数据的页数来判断
四、通过performance_schema表来观察内存消耗情况
SELECT
event_name,
COUNT_ALLOC,
SUM_NUMBER_OF_BYTES_ALLOC '总的BYTE大小',
CURRENT_COUNT_USED '当前使用次数',
CURRENT_NUMBER_OF_BYTES_USED/1024/1024 '当前使用大小(M)',
HIGH_NUMBER_OF_BYTES_USED/1024/1024 '最高使用(M)'
FROM
`performance_schema`.memory_summary_global_by_event_name
ORDER BY
SUM_NUMBER_OF_BYTES_ALLOC DESC;
--也可以sys查看:
select * from sys.memory_global_by_current_bytes ORDER BY current_alloc desc LIMIT 10;
select THREAD_ID,event_name,COUNT_ALLOC,SUM_NUMBER_OF_BYTES_ALLOC,CURRENT_COUNT_USED,CURRENT_NUMBER_OF_BYTES_USED,HIGH_NUMBER_OF_BYTES_USED
from `performance_schema`.memory_summary_by_thread_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc LIMIT 10;
--sys表
select * from sys.memory_by_thread_by_current_bytes ORDER BY total_allocated desc LIMIT 10;
select host,user,event_name,COUNT_ALLOC,SUM_NUMBER_OF_BYTES_ALLOC,CURRENT_COUNT_USED,CURRENT_NUMBER_OF_BYTES_USED,HIGH_NUMBER_OF_BYTES_USED
from `performance_schema`.memory_summary_by_account_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc LIMIT 10;
--sys表
select * from sys.memory_by_user_by_current_bytes;
select host,event_name,COUNT_ALLOC,SUM_NUMBER_OF_BYTES_ALLOC,CURRENT_COUNT_USED,CURRENT_NUMBER_OF_BYTES_USED,HIGH_NUMBER_OF_BYTES_USED
from `performance_schema`.memory_summary_by_host_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc LIMIT 10;
--sys表
select * from sys.memory_by_host_by_current_bytes
select user,event_name,COUNT_ALLOC,SUM_NUMBER_OF_BYTES_ALLOC,CURRENT_COUNT_USED,CURRENT_NUMBER_OF_BYTES_USED,HIGH_NUMBER_OF_BYTES_USED
from `performance_schema`.memory_summary_by_user_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc LIMIT 10;