linux 内存分配参数导致的 buffer_pool 分配不出来的问题排查:

参考:http://blog.csdn.net/jollyjumper/article/details/24127009

原文:http://www.cnblogs.com/gomysql/p/6130405.html



vm.overcommit_memory

默认值为:0

从内核文档里得知,该参数有三个值,分别是:

0:当用户空间请求更多的的内存时,内核尝试估算出剩余可用的内存。

1:当设这个参数值为1时,内核允许超量使用内存直到用完为止,主要用于科学计算.

2:当设这个参数值为2时,内核会使用一个决不过量使用内存的算法,即系统整个内存地址空间不能超过swap+50%的RAM值,50%参数的设定是在overcommit_ratio中设定。



vm.overcommit_ratio

默认值为:50

这个参数值只有在vm.overcommit_memory=2的情况下,这个参数才会生效。【使用 cat /proc/sys/vm/overcommit_ratio 查看】




那么我们来看一下总的内存地址不能超过多少。其实是可以直接查看的。


[root@yayundeng 3306]# cat /proc/meminfo |grep -i commit

CommitLimit:    70144396 kB  最大可用虚拟内存【就是说mysql的buffer_pool 最大差不多能分配这么多kB的内存空间】

Committed_AS:     135196 kB  已使用虚拟内存

通过查看可以得知在70G的样子。那么这个是如何计算的呢。



具体的70GB的计算方法如下:

最大可分配的虚拟内存(CommitLimit) = 总物理内存(MemTotal) × 百分比(vm.overcommit_ratio) + 交换分区大小(Swap)


对于我们上面这个环境来说,就是下面这个样子:

[root@yayundeng 3306]# cat /proc/meminfo | grep MemTotal

MemTotal:       132096808 kB  总物理内存


[root@yayundeng 3306]# free -k

             total       used       free     shared    buffers     cached

Mem:     132096808    1583944  130512864          0      10240     133220

-/+ buffers/cache:    1440484  130656324

Swap:      4095992          0    4095992


[root@yayundeng 3306]# cat /proc/sys/vm/overcommit_ratio 

50


最大可分配的虚拟内存 = 132096808*50% + 4095992 = 70144396 kB 差不多在70GB ,稳妥的话,设置60GB的buffer_pool即可。