MySQL innodb_buffer_pool 內存分配過程

MySQL innodb_buffer_pool是在mysqld啓動時分配?操作系統如何顯示


查看my.cnf中配置:innodb_buffer_pool_size = 20G,物理機實際內存32G

 

mysqld啓動前後內存使用對比:


啓動mysql 後,used增加了1.5G,cached增加2M

 

top查看mysqld進程

VIRT:

1.進程需要的內存大小,包括進程使用的庫、代碼、數據,以及mallocnew分配的堆空間和分配的棧空間等;

2. mysqld申請22.3G的內存,但實際只使用了1.5G,那麼virt它會增長22.3G,而不是實際的1.5G使用量。

3. MySQL啓動時實際只是在虛擬內存中分配了地址空間,而並沒有真正的映射到物理內存上。

4.VIRT =SWAP + RES

 

Linux malloc內存分配:

1.malloc分配內存是先在虛擬內存中分配地址的,到實際使用時才真正的映射到物理內存

2. 到了MySQL真正要映射物理內存時,首先分配物理內存,此時topres增加

3.如果物理內存不夠用了,分配swap,此時性能很差,此時topres增加

所以,如果由於機器內存使用不當,到了MySQL真正要映射物理內存時,如果物理內存(內存+swap)不足了,就會出錯甚至退出。

 

結論:innodb_buffer_pool_size= 20Gmysqld啓動時在虛擬內存中分配地址,在使用過程中再映射到物理內存,如果物理內存(內存+swap)不足了,就會出錯甚至退出。

 

篇外:Linux下的OOM Killer:

假如一個程序A已經運行,並且分配了22G內存(機器配置是物理內存16G+SWAP 8G),但是沒有真正的映射到物理內存;

這時MySQL啓動,innodb_buffer_pool_size=8G,啓動正常;

然後程序A開始實際分配物理內存,一下子只剩下2GSWAP內存了;

這時MYSQL也開始實際使用內存,因爲只有2GSWAP,所以性能很差,再超過2G時,內存耗盡,這時OOMKiller開始殺進程,怎麼殺呢,誰佔用內存多殺誰,於是將進程A殺掉了,內存一下子回來了,MySQL不會退出;

但是一般系統中MySQL都是分配內存最大的,所以經常性的是MySQL被殺掉。

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章