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


16

最近,由于内存不足,我一直无法正常运行。(我的VPS总共有256M)

我正在尝试使用mysqltuner.pl调整MySQL,并获得以下结果:

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

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

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

--------建议----------------------------------------- ------------
一般建议:
    运行OPTIMIZE TABLE来对表进行碎片整理以获得更好的性能
    MySQL在过去24小时内启动-建议可能不正确
    减少总体MySQL内存占用量,以提高系统稳定性
要调整的变量:
  *** MySQL的最大内存使用率非常高***
  ***在增加MySQL缓冲区变量之前添加RAM ***
    key_buffer_size(> 9.4M)

但是我对如何降低最大内存使用量感到困惑?它似乎基于key_buffer和max_connections,但是还必须包含其他内容吗?

my.cnf:

key_buffer = 8M
max_allowed_pa​​cket = 12M
线程堆栈= 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调优文章,但它们似乎是针对那些已经知道自己在做什么的人的!任何帮助,将不胜感激。谢谢!


1
我遵循了评论者的建议,并将其降低到合理的水平,但我仍然对这些值的合理设定感到好奇吗?某些在线文章使用64K,而其他一些文章建议使用512M以获得相同的价值!
尼克

Answers:


10

您有一台具有256M的服务器,但是您无法使用所有服务器-请记住,这会占用一些OS开销。再加上您像其他人所说的那样过度投入,肯定会在这里失败。256M仅适用于一个小型DB,您所配置的20个连接就足够了。

1)将最大连接数减少到4(您使用的是20个中的3个)

2)更好地优化查询缓存;8M确实很大,根据您的点击量/修剪量,总共有6400万;尝试4/32组合,看看效果如何。确实,我认为2/24组合适合您。

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

4)您实际上有128张桌子吗?尝试将table_cache减半为64或48

5)将thread_cache_size减少到4

6)优化那些表以减少碎片

这些是开始的一些事情。好像您在配置中扔了很多数字,却没有任何实际的配置文件来知道您需要什么并造成了混乱。如果所有其他方法均失败,请返回默认值,并摆脱您的自定义设置,然后使用您可以在Google上找到的一些性能调整指南重新开始。获取SHOW VARIABLES和SHOW STATUS的输出,找到任意一种调优指南,并将实际的,实数插入其方程式,这将告诉您需要放入配置文件中的精确数字。


3
这是一个古老问题的老答案,但我想指出,在问问者发布的mysqltuner结果中,服务器仅运行了40秒钟,这还不足以准确判断服务器将看到的负载。理想情况下,您将在一整天或更长时间的时间内运行mysqltuner几次,然后分析结果。除此之外,您的建议是合理的。
instanceofTom

8

我不是MySQL专家,并且无法使用此信息诊断问题,但是我尝试在源代码中搜索公式。这里是:

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 + max_allowed_packet + join_buffer_size

现在,您必须检查这些值中的每一个,并找出哪个值是造成这个巨大数字的原因。并且不要毫无保留地信任此脚本-我尝试在我的一台数据库服务器上运行该脚本,并且计算得出最大内存为物理内存总量的140%,但是系统已经运行多年,没有任何稳定性问题。

祝好运!


0

如果我没记错的话,MySQL Tuner使用以下公式估算最大使用量:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

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

您可以开始调低配置文件中的某些设置并再次运行调谐器,但是如果您没有时间浪费更改my.cnf,重新启动它并运行调谐器,我建议您寻求专家的帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.