首页 / MYSQL / mysql占用内存过多
mysql占用内存过多
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql占用内存过多,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4048字,纯文字阅读大概需要6分钟。
内容图文
![mysql占用内存过多](/upload/InfoBanner/zyjiaocheng/871/99f9b9f731f8467c80cb1b651a6ba52e.jpg)
一、计算mysql所需的内存
https://www.cnblogs.com/cheyunhua/p/9045057.html 理论有待学习
https://www.cnblogs.com/simplelogic/archive/2012/12/06/2804798.html
mysql used mem = key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + max_connections * ( read_buffer_size + read_rnd_buffer_size + sort_buffer_size+ join_buffer_size + binlog_cache_size + thread_stack ) 在mysql 中输入如下命令,可自动计算自己的当前配置最大的内存消耗 SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’; SHOW VARIABLES LIKE ‘innodb_additional_mem_pool_size’; SHOW VARIABLES LIKE ‘innodb_log_buffer_size’; SHOW VARIABLES LIKE ‘thread_stack’; SET @kilo_bytes = 1024; SET @mega_bytes = @kilo_bytes * 1024; SET @giga_bytes = @mega_bytes * 1024; SET @innodb_buffer_pool_size = 2 * @giga_bytes; SET @innodb_additional_mem_pool_size = 16 * @mega_bytes; SET @innodb_log_buffer_size = 8 * @mega_bytes; SET @thread_stack = 192 * @kilo_bytes; SELECT ( @@key_buffer_size + @@query_cache_size + @@tmp_table_size + @innodb_buffer_pool_size + @innodb_additional_mem_pool_size + @innodb_log_buffer_size + @@max_connections * ( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size + @@join_buffer_size + @@binlog_cache_size + @thread_stack ) ) / @giga_bytes AS MAX_MEMORY_GB; 在mysql 中输入如下命令,可显示各占内存参数大小 SHOW VARIABLES LIKE ‘key_buffer_size’; SHOW VARIABLES LIKE ‘query_cache_size’; SHOW VARIABLES LIKE ‘tmp_table_size’; SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’; SHOW VARIABLES LIKE ‘innodb_additional_mem_pool_size’; SHOW VARIABLES LIKE ‘innodb_log_buffer_size’; SHOW VARIABLES LIKE ‘read_buffer_size’; SHOW VARIABLES LIKE ‘read_rnd_buffer_size’; SHOW VARIABLES LIKE ‘sort_buffer_size’; SHOW VARIABLES LIKE ‘join_buffer_size’; SHOW VARIABLES LIKE ‘binlog_cache_size’; SHOW VARIABLES LIKE ‘thread_stack’;
二、查看innodb缓冲池实际使用内存
通过将缓冲池中可用的数据与InnoDB页面(InnoDB缓冲池单位)大小相乘,可以计算InnoDB缓冲池此时正在使用的实际内存。从MySQL 5.7.6开始,GLOBAL_STATUS表中提供的信息从Performance Schema获取。
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;
分配36G,实际使用34.5G,占比95%
由top命令可知mysql数据库占服务器内存93%,即
数据库内存:48*0.93=44.64GB
数据库内存明细:34.55G+32+128+1600*4+200+3200=44.74GB
三、查看数据库连接数情况
Max_connections:整个服务器的用户限制,即mysql上限连接数 ,增加该值增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存
Max_user_connections: 限制每个用户的session连接个数,例如max_user_connections=1 ,那么用户u1只能连接的session数为1,如果还有用户u2,还是可以连接,但是连接数仍然为1,如果数据库只有一个用户,那Max_user_connections自然等于Max_connections。
Max_used_connections:mysql历史响应最大连接数
Max_connect_errors:默认10,每个主机的连接请求异常中断的最大次数
Max_connections_used_rate:最大连接数使用率,历史最大连接数占上限连接数的85%左右,如果发现比例在10%以下,证明MySQL服务器连接数上限设置的过高了
show variables like '%connect%'; show global status like 'Max_used_connections'; show global status like 'Threads_connected'; --最大连接数使用率(建议85%) Max_used_connections/max_connections --当前连接数使用率 Threads_connected/max_connections
从最大连接数使用率可知max_connections设置的过高了
四、优化数据库连接数配置
优化如下:
max_connections=350 max_connect_errors=50 max_user_connections=300
这里只是从连接数角度来做优化,实际场景需结合当前正在运行的sql做分析,例如可能有条sql正在做全扫,占了内存池很大空间,可以同时从show full processlist和sys.memory_global_by_current_bytes来进一步观察,这里也是需要考虑的一个点。
内容总结
以上是互联网集市为您收集整理的mysql占用内存过多全部内容,希望文章能够帮你解决mysql占用内存过多所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。