MySQL記憶體管理機制

2022-07-15 05:06:09 字數 2712 閱讀 7525

mysql innodb buffer pool,mysql innodb 緩衝池。裡面快取著大量資料(資料頁),使 cpu 讀取或寫入資料時,不直接和低速的磁碟打交道,直接和緩衝區進行互動,從而解決了因為磁碟效能慢導致的資料庫效能差的問題。

buffer pool 最主要的功能便是加速讀加速寫

加速讀就是當需要訪問乙個資料頁的時候,如果這個頁已經在快取池中,那麼就不再需要訪問磁碟,直接從緩衝池中就能獲取這個頁面的內容。

加速寫就是當需要修改乙個資料頁的時候,先將這個頁在緩衝池中進行修改,記下相關的 redo log,這個頁的修改就算已經完成了。至於這個被修改的頁什麼時候真正重新整理到磁碟,這個是 buffer pool 後台重新整理執行緒來完成的。

所有從磁碟載入進記憶體的資料頁,都會通過這個buffer pool管理起來。對應在**的中的結構體為buf_pool_t。在mysql中通常會有多個buffer pool instance,這是為了減少多執行緒併發訪問時,buffer pool鎖等待的開銷

bufferpool由buf_pool,buf_chunk,buf_blockbuf_page組成,結構如下:

struct buf_pool_t
struct buf_chunk_t
struct buf_block_t
class buf_page_t
innodb 基於lru演算法管理 buffer pool 中的資料頁。一般情況下 list 頭部存放的是熱資料,就是所謂的 young page(最近經常訪問的資料),list 尾部存放的就是 old page(最近不被訪問的資料)。

lru list:快取了所有讀入記憶體的資料頁。包含三類:

未修改的頁面,可以從該鍊錶中摘除,然後移到 free list 中;

已修改還未重新整理到磁碟的頁面;

已修改且已經重新整理到磁碟的頁面,可並為第一類。

free list:空閒記憶體頁列表,需要裝載(快取)磁碟上資料頁的時候,從此列表取記憶體塊。

flush list:在記憶體中被修改但還沒有重新整理到磁碟的資料頁(髒頁)鍊錶,記憶體中的資料跟對應磁碟上的資料不一致,屬於該鍊錶的頁同樣存在於 lru list 中,但反之未必

當訪問的頁面在快取池中命中,則直接從緩衝池中訪問該頁面。如果沒有命中,則需要將這個 page 從磁碟上載入到快取池,因此需要在快取池中的 free list 中找乙個空閒的記憶體頁來快取這個從磁碟讀入的 page。

但存在空閒記憶體頁被使用完的情況,不保證一定有空閒的記憶體頁。假如 free list 為空,則需要想辦法產生空閒的記憶體頁。 首先是在 lru list 中找可以替換的記憶體頁,查詢方向是從列表的尾部開始找,如果找到可以替換的 page,將其從 lru list 中摘除,加入 free list,然後再去 free list 中找空閒的記憶體頁。第一次查詢最多隻掃瞄 100 個 page,迴圈進行到第二次時,查詢深度就是整個 lru list。這就是 lru list 的頁面淘汰機制。

如果在 lru list 中沒有找到可以替換的頁,則進行單頁重新整理,將髒頁重新整理到磁碟後,再將釋放的記憶體頁加入到 free list,最後再去 free list 取。為什麼只做單頁重新整理呢?因為它的目的是獲取空閒記憶體頁,進行髒頁重新整理是不得已而為之,所以只會進行乙個頁的重新整理,目的是為了盡快的獲取空閒記憶體頁。

因為 free list 是乙個公共的鍊錶,所有的使用者執行緒都可以使用,存在爭用的情況。因此,自己產生的空閒記憶體頁有可能會剛好被其它執行緒所使用,因此使用者執行緒可能會重複執行上面的查詢流程,直到找到空閒的記憶體頁為止。

通過資料頁訪問機制,可以知道當無空閒頁時產生空閒頁就成為了乙個必須要做的事情。

如果需要通過重新整理髒頁來產生空閒頁或者需要掃瞄整個 lru list 來產生空閒頁,查詢空閒頁的時間就會延長,這是乙個 bad case。

因此,innodb buffer pool 中存在大量可以替換的頁,或者 free list 中一直存在著空閒記憶體頁,對快速獲取空閒記憶體頁就起到了決定性的作用。

而在 innodb buffer pool 的機制中,是採用何種方式來產生空閒記憶體頁以及可以替換的記憶體頁呢?這就是下面要講的內容——髒頁重新整理策略。

mysql執行緒後台會有flush執行緒,定期地將flush list的髒頁flush到磁碟上,這樣可以減輕check point的開銷,和頁面替換時,那些被替換頁面的flush開銷,而使得讀取頁面時間增長。flush list的頁面根據修改的時間從新到老進行排序,也即是最新的修改,在flush list的頭部,最老的修改在flush list的尾部。當flush時,從尾部取page flush到磁碟上。這樣的邏輯是跟checkpoint保持一致,checkpoint的流程也是從老到新一步步持久化page,所以可以加快checkpoint。

參考:mysql--innodb buffer pool詳解

mysql記憶體管理機制

mysql buffer pool中的三種鏈

記憶體管理機制

記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...

記憶體管理機制

記憶體管理是乙個作業系統必不可少 並且 非常重要的一環 linux 的成功 和它優秀的記憶體管理聯絡非常密切 因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制 我項很多人吃過 dos 下 640k 的苦吧 前面我們介紹了 386 保護模式 從今天起我們將在此基礎上 分析 linux 的虛擬儲...

iOS 記憶體管理機制

學習要點 1.reference counting 引用計數機制 2.了解mrc apc和gc 3.autoreleasepool 執行機制 4.如何避免 retain cycle reference counting 引用計數機制 cocoa 上基本的記憶體管理機制就是引用計數,通過乙個 refe...