![MySQL(MariaDB)内存计算和使用率蠕变](https://linux22.com/image/1584537/MySQL%EF%BC%88MariaDB%EF%BC%89%E5%86%85%E5%AD%98%E8%AE%A1%E7%AE%97%E5%92%8C%E4%BD%BF%E7%94%A8%E7%8E%87%E8%A0%95%E5%8F%98.png)
我使用了 mysql 内存计算器(http://www.mysqlcalculator.com) 来估算我的专用 mysql 服务器(具有 8GB RAM 和 4CPU)的内存使用情况。
这些是实际数字和我的用量计算:
binlog_cache_size 32.00 KB
innodb_buffer_pool_size 5120.00 MB
innodb_log_buffer_size 8.00 MB
join_buffer_size 1.00 MB
key_buffer_size 128.00 MB
max_connections 150
query_cache_size 0
read_buffer_size 128.00 KB
read_rnd_buffer_size 256.00 KB
sort_buffer_size 2.00 MB
thread_stack 292.00 KB
tmp_table_size 32.00 MB
=================================== ==========
Total Max Memory 5841.73 MB
=================================== ==========
在一周的时间内,内存不断增加,远远超出了预计的计算范围,直到它消耗了几乎全部 8GB,并且直到引擎重新启动时才回落。
所以我的猜测是,计算中省略了一些变量,导致了这种过度使用。
关于如何解决此问题,有什么建议吗?
答案1
好的,该计算器似乎有错误(http://www.mysqlcalculator.com/) 。
tmp_table_size
应包含在每个连接的计算中,而不是在基本内存计算中。
基本内存变量是 max_connections 上面列出的变量,每个连接的变量列在下面。
这对计算产生了很大的影响,也是实际使用情况与计算不符的原因。
这是由以下人员提供的:@克里斯托弗·舒尔茨
SELECT ( @@key_buffer_size
+ @@query_cache_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
+ @@tmp_table_size )
) / (1024 * 1024 * 1024) AS MAX_MEMORY_GB;
答案2
不幸的是,mysqlcalculator.com 忽略了一些重要的设置。另一个答案并不完整。这是来自一个方便的MySQL/MariaDB 调优文章:
SELECT (
(
@@binlog_file_cache_size +
@@innodb_buffer_pool_size +
@@innodb_log_buffer_size +
@@key_buffer_size +
@@query_cache_size +
( @@max_connections *
( @@binlog_cache_size +
@@binlog_stmt_cache_size +
@@bulk_insert_buffer_size +
@@join_buffer_size +
@@max_allowed_packet +
@@read_buffer_size +
@@read_rnd_buffer_size +
@@sort_buffer_size +
@@thread_stack +
@@tmp_table_size
)
) +
( @@slave_parallel_threads *
( @@slave_parallel_max_queued )
) +
( @@open_files_limit * 1024)
) / 1024 / 1024 / 1024) AS max_memory_GB;
调整这些设置直到所有内容适合您的 RAM。
披露:我写了所引用的文章。