MySQL:如何获得“可能的最大内存使用量”?

我最近因为内存不足而出现抖动问题。 (我的VPS总共有256M)

我试图用mysqltuner.pl来调优MySQL,并得到以下结果:

 --------一般统计---------------------------------------- ----------
 [ - ]跳过版本检查MySQLTuner脚本
 [确定]当前正在运行支持的MySQL版本5.0.51a-3ubuntu5.4-log
 [确定]在64位体系结构上运行

 --------存储引擎统计--------------------------------------- ----
 [ - ]状态:+存档-BDB -Federated -InnoDB -ISAM -NDBCluster 
 [ - ] MyISAM表中的数据:114M(表:454)
 [!!]碎片表总数:34

 -  -  -  -  性能指标  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - ---------
 [ - ]上限:40s(570 q [14.250 qps],23 conn,TX:154K,RX:23K)
 [ - ]读/写:100%/ 0%
 [ - ]总caching:338.0M全局+每个线程2.7M(最多20个线程)
 [!!]最大可能的内存使用量:392.9M(已安装RAM的153%)
 [确定]慢查询:0%(5/570)
 [确定]可用连接的最高使用率:15%(3/20)
关键缓冲区大小/总MyISAM索引:8.0M / 9.4M
关键缓冲区命中率:57.1%(7个caching/ 3个读取)
 [确定]查询caching效率:21.9%(7个caching/ 32个select)
 [确定]每天查询caching修剪:0
 [确定]需要临时表的sorting:0%(0次临时sorting/ 1次sorting)
 [确定]磁盘上创build的临时表:0%(磁盘上为0 /总计32)
 [确定]线程caching命中率:86%(已创build3个/ 23个连接)
 [确定]表caching命中率:26%(128打开/ 484打开)
 [确定]打开文件限制:25%(259 / 1K)
 [OK]立即获取表锁:100%(492立即/ 492锁)

 --------build议----------------------------------------- ------------
一般build议:
    运行OPTIMIZE TABLE进行碎片整理以获得更好的性能
     MySQL在过去24小时内启动 - 推荐可能不准确
    减less您的整体MySQL内存足迹,以保持系统稳定性
variables调整:
   *** MySQL的最大内存使用率是危险的高***
   ***在增加MySQL缓冲区variables之前添加RAM
     key_buffer_size(> 9.4M)

但是我对如何获得最大的内存使用量有点困惑? 它似乎是基于key_buffer和max_connections,但还有其他一些事情呢?

my.cnf文件:

 key_buffer = 8M
 max_allowed_pa​​cket = 12M
 thread_stack = 128K
 thread_cache_size = 8
 max_connections = 20
 table_cache = 128
 tmp_table_size = 256M
 max_heap_table_size = 256M
 join_buffer_size = 256K
 query_cache_limit = 8M
 query_cache_size = 64M

我一直在试图通读MySQL调优文章,但他们似乎面向已经知道他们在做什么的人! 任何帮助,将不胜感激。 谢谢!

你有一个256M的服务器,但你不能使用所有的 – 记住有一些操作系统开销。 再加上其他人提到的事实,你肯定会在这里摔打。 256M只适用于一个小型的数据库,20个连接与你所configuration的很多。

1)减less你的最大连接数为4(你使用的是20个中的3个)

2)更好地优化你的查询caching; 8M真的很大,总共64M是基于你的命中/梅干很多, 尝试一个4/32组合,看看它是怎么回事。 真的,我认为2/24的组合会适合你。

3)你没有需要临时表的sorting,为什么那里有max_heap_table_size动词? 注释掉,使用默认值

4)你真的有128桌吗? 尝试削减table_cache一半64或48

5)将thread_cache_size减less到4

6)优化这些表以减less碎片

这是一些开始的事情。 看起来你在一个configuration中扔了一堆数字,没有任何实际的分析知道你需要什么,并创造了一个混乱; 如果一切都失败了,请回到默认设置,摆脱自定义设置,重新开始使用一些您可以在Google上find的性能调整指南。 获得SHOW VARIABLES和SHOW STATUS的输出,findbajillion调谐指南中的任何一个,并将实际的实际数字插入它们的公式中,并且会告诉您需要放置在configuration文件中的确切数字。

我不是一个MySQL的大师,我不能用这个信息来诊断问题,但我试图在源代码中search公式。 这里是:

server_buffers + total_per_thread_buffers * max_connections 

哪里:

 server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size 

和:

 total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size 

现在你必须检查每个这些值,并找出哪一个负责这个庞大的数字。 不要相信这个脚本 – 我尝试在我的一个数据库服务器上运行它,并计算出最大内存是物理内存总量的140%,但系统已经运行了多年,没有任何稳定性问题。

祝你好运!

如果我没有记错,MySQL调谐器使用以下公式来估计最大使用量:

 read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size 

请记住,这不是100%正确的,实际上只是一个估计,因为MySQL中的某些设置没有定义的限制。

您可以开始调整configuration文件中的一些设置并再次运行调谐器,但是如果您没有时间浪费更改my.cnf,重新启动调谐器并运行调谐器,我build议您得到专家的帮助。

使用mysqlcalculator.com软件可以节省您很多时间。