天天看點

linux 記憶體配置設定參數導緻的 buffer_pool 配置設定不出來的案例排查

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

後期參考:http://blog.csdn.net/jollyjumper/article/details/24127009

一台約128G記憶體的伺服器,跑了1個MySQL,設定96G的bufferpool,但提示配置設定失敗。後來發現是核心參數問題。如下:

vm.overcommit_memory

預設值為:0

cat /proc/sys/vm/overcommit_memory

從核心文檔裡得知,該參數有三個值,分别是:

0:當使用者空間請求更多的的記憶體時,核心嘗試估算出剩餘可用的記憶體。【預設值】

1:當設這個參數值為1時,核心允許超量使用記憶體直到用完為止,主要用于科學計算.

2:當設這個參數值為2時,核心會使用一個決不過量使用記憶體的算法,即系統整個記憶體位址空間不能超過swap+50%的RAM值,50%參數的設定是在overcommit_ratio中設定。

具體的描述:

取值為0,系統在為應用程序配置設定虛拟位址空間時,會判斷目前申請的虛拟位址空間大小是否超過剩餘記憶體大小,如果超過,則虛拟位址空間配置設定失敗。是以,也就是如果程序本身占用的虛拟位址空間比較大或者剩餘記憶體比較小時,fork、malloc等調用可能會失敗。

取值為1,系統在為應用程序配置設定虛拟位址空間時,完全不進行限制,這種情況下,避免了fork可能産生的失敗,但由于malloc是先配置設定虛拟位址空間,而後通過異常陷入核心配置設定真正的實體記憶體,在記憶體不足的情況下,這相當于完全屏蔽了應用程序對系統記憶體狀态的感覺,即malloc總是能成功,一旦記憶體不足,會引起系統OOM殺程序,應用程式對于這種後果是無法預測的

取值為2,則是根據系統記憶體狀态确定了虛拟位址空間的上限,由于很多情況下,程序的虛拟位址空間占用遠大小其實際占用的實體記憶體,這樣一旦記憶體使用量上去以後,對于一些動态産生的程序(需要複制父程序位址空間)則很容易建立失敗,如果業務過程沒有過多的這種動态申請記憶體或者建立子程序,則影響不大,否則會産生比較大的影響

vm.overcommit_ratio

預設值為:50 【 cat /proc/sys/vm/overcommit_ratio 】

這個參數值隻有在vm.overcommit_memory=2的情況下,這個參數才會生效,用于虛拟記憶體的實體記憶體的百分比,資料庫建議改成10。

那麼我們來看一下總的記憶體位址不能超過多少。其實是可以直接檢視的。

[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  總實體記憶體大約125GB 

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

文中作者後來也說了,這台伺服器之前跑的是其他服務,設定了vm.overcommit_memory=2,後來作為MySQL伺服器使用時候,沒有重裝系統,直接拿來使用的。是以這種情況下,最好還是重裝個幹淨的系統為好。

本文轉自 lirulei90 51CTO部落格,原文連結:http://blog.51cto.com/lee90/1977195,如需轉載請自行聯系原作者

繼續閱讀