linux 記憶體分配參數導致的 buffer_pool 分配不出來的問題排查

  • 2019 年 10 月 4 日
  • 筆記

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即可。