mysql Sort aborted: Out of sort memory, consider increasing server sort buffer size的解决方法
今天在检查mysql服务器的时候提示Sortaborted:Outofsortmemory,considerincreasingserversortbuffersize,安装字面意思就是sort内存溢出,考虑增加服务器的排序缓冲区(sort_buffer_size)大小
sort_buffer_size=3M
join_buffer_size=3M
下面是针对16G内存设置的参数:
sort_buffer_size=2M
#Sort_Buffer_Size是一个connection级参数,在每个connection(session)第一次需要使用这个buffer的时候,一次性分配设置的内存。
#Sort_Buffer_Size并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。例如:500个连接将会消耗500*sort_buffer_size(8M)=4G内存
#Sort_Buffer_Size超过2KB的时候,就会使用mmap()而不是malloc()来进行内存分配,导致效率降低。
#技术导读http://blog.webshuo.com/2011/02/16/mysql-sort_buffer_size/
#dev-doc:http://dev.mysql.com/doc/refman/5.5/en/server-parameters.html
#explainselect*fromtablewhereorderlimit;出现filesort
#属重点优化参数
不过我看到有人将sort_buffer_size设置为10M,我就是因为设置了10M,后来我设置为2-3M,就没有问题了
Writtenbycenalulu@2010-10-26
基础知识:
1、Sort_Buffer_Size是一个connection级参数,在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存。
2、Sort_Buffer_Size并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。
3、文档说“OnLinux,therearethresholdsof256KBand2MBwherelargervaluesmaysignificantlyslowdownmemoryallocation”
本文主要针对第三点做测试:
据说Sort_Buffer_Size超过2KB的时候,就会使用mmap()而不是malloc()来进行内存分配,导致效率降低。
环境:
为了更大的体现性能差距,使用1GB内存的Fedora虚拟机进行测试
测试表结构:
1w行的表,表结构
+-------+------------------+------+-----+---------+----------------+
|Field|Type |Null|Key|Default|Extra |
+-------+------------------+------+-----+---------+----------------+
|id |int(10)unsigned|NO |PRI|NULL |auto_increment|
|k |int(10)unsigned|NO |MUL|0 | |
|c |char(120) |NO | | | |
|pad |char(60) |NO | | | |
+-------+------------------+------+-----+---------+----------------+
测试语句:
分别设置Sort_Buffer_Size为250K,512K,3M,然后运行以下语句,查看运行时间。
1.sql_no_cache防止querycache起效。
2.limit1为了减少排序占执行时间的比重,更多的体现内存分配带来的影响
3.语句explain的结果是filesort,以确保使用sort_buffer
mysqlslap-uroot-h127.0.0.1-q'selectsql_no_cache*fromsbtestorderbypadlimit1'-c100--create-schema=test-i10
测试结果:
执行时间
250K:1.318s
512K:1.944s
3M :2.412s
250K
[root@localhosttmp]#mysqlslap-uroot-h127.0.0.1-q'selectsql_no_cache*fromsbtestorderbypadlimit1'-c100--create-schema=test-i10
Benchmark
Averagenumberofsecondstorunallqueries:1.318seconds
Minimumnumberofsecondstorunallqueries:1.285seconds
Maximumnumberofsecondstorunallqueries:1.378seconds
Numberofclientsrunningqueries:100
Averagenumberofqueriesperclient:1
512K
[root@localhosttmp]#mysqlslap-uroot-h127.0.0.1-q'selectsql_no_cache*fromsbtestorderbypadlimit1'-c100--create-schema=test-i10
Benchmark
Averagenumberofsecondstorunallqueries:1.944seconds
Minimumnumberofsecondstorunallqueries:1.362seconds
Maximumnumberofsecondstorunallqueries:4.406seconds
Numberofclientsrunningqueries:100
Averagenumberofqueriesperclient:1
3M
[root@localhosttmp]#mysqlslap-uroot-h127.0.0.1-q'selectsql_no_cache*fromsbtestorderbypadlimit1'-c100--create-schema=test-i10
Benchmark
Averagenumberofsecondstorunallqueries:2.412seconds
Minimumnumberofsecondstorunallqueries:2.376seconds
Maximumnumberofsecondstorunallqueries:2.527seconds
Numberofclientsrunningqueries:100
Averagenumberofqueriesperclient:1
结论:
确实如文档所说,使用mmap分配内存时,会带来性能上的损耗,影响大约在30%左右。
由于是limit1,因此减弱了buffersize对排序速度的影响。
其实buffersize越大,所需要进行的sort-merge的次数越少,执行时间越短。视具体的语句而定。
我只是想说明下,并不是越大越好。也并不存在一个绝对的最佳值。
还是要看具体的业务环境决定值的大小。对于高并发的应用,还是别设置太大的比较好。