程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MYSQL,innodb_buffer_pool_size內存分配方式

MYSQL,innodb_buffer_pool_size內存分配方式

編輯:MySQL綜合教程

MYSQL,innodb_buffer_pool_size內存分配方式


以前一直以為MYSQL,innodb_buffer_pool_size=8G,MySQL一起動就會將占用掉8G內存(認為TOP可以看到內存被使用了8G),但是最近才仔細研究一下,原來不是這樣的(可能自己對Linux malloc內存分配也只是知道了個皮毛吧),MySQL啟動時實際只是在虛擬內存中分配了地址空間,而並沒有真正的映射到物理內存上。

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

因此這個地方,如果由於機器內存使用不當,到了MySQL真正要映射物理內存時,如果物理內存不足了,就會出錯甚至退出。

但是這裡也有個很奇妙的地方就是Linux下的OOM Killer: 

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

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

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

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

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

Linux OOM Killer可參見:理解和配置 Linux 下的 OOM Killer

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved