InnoDB原始碼分析 緩衝池(三)

2021-07-13 11:17:30 字數 1895 閱讀 4201

昨天寫到了innodb緩衝池的預讀:《innodb原始碼分析--緩衝池(二)》,最後因為著急看歐洲盃,沒有把線性預讀寫完,今天接著寫。

線性預讀是由這個函式實現的:buf_read_ahead_linear,和隨機預讀一樣,首先是要確定區域邊界,這個邊界內被訪問過的page如果達到乙個閾值(buf_read_ahead_linear_threshold),就會觸發預讀操作。邊界的演算法由buf_read_ahead_linear_area決定:

low  = (offset /buf_read_ahead_linear_area)

*buf_read_ahead_linear_area;

high = (offset / buf_read_ahead_linear_area + 1

) *buf_read_ahead_linear_area;

if ((offset != low) && (offset != high - 1

))

注意,如果offset不在邊界上,就不會進行預讀了,這一點和隨機預讀是不一樣的。線性預讀其實是順序性讀取的,如果offset在low位置,逆序讀取page,如果offset在high位置,正序讀取page。讀取的每個頁,都要進行判斷,如果被訪問過的頁的數量到達上面提到的閾值,就滿足了線性預讀的條件,達不到閾值,就不進行預讀,**如下:

asc_or_desc = 1

; //預設正序

if (offset ==low)

fail_count = 0

;

for (i = low; i < high; i++)

else

if(pred_block

&& (ut_ulint_cmp(block->lru_position,

pred_block->lru_position)

!=asc_or_desc))

}if (fail_count >buf_read_ahead_linear_area

-buf_read_ahead_linear_threshold)

我之前在一本書上看到過一句話,大概意思是記憶體裡的頁可以不是物理上連續的,邏輯上卻是連續的。這裡的線性預讀要求這些頁在物理上也是必須連續的:

pred_offset =fil_page_get_prev(frame);

succ_offset =fil_page_get_next(frame);

mutex_exit(&(buf_pool->mutex));

if ((offset == low) && (succ_offset == offset + 1

))

else

if ((offset == high - 1) && (pred_offset == offset - 1

))

else

這個地方是這樣的,首先利用fil_page_get_prev和fil_page_get_next函式讀取offset->frame之後或者之前的4個bytes,如果結果滿足順序條件,可以繼續進行線性預讀。

for (i = low; i < high; i++) }}

線性預讀還是利用了buf_read_page_low函式,這一點和隨機預讀一樣,而且是非同步方式。

至此便完成了線性預讀。

不管是隨機預讀還是線性預讀,都會有一些條件不進行預讀,比如系統壓力大的時候不預讀,這個的實現:

if (buf_pool->n_pend_reads

> buf_pool->curr_size /buf_read_ahead_pend_limit)

這裡規定了pend讀取數大於buf_pool->curr_size一半的時候,就不預讀了,相似的還有很多條件,都在**裡,這裡就不寫了。

innoDB原始碼分析 緩衝池

最開始學oracle的時候,有個概念叫sga和pga,是非常重要的概念,其實就是記憶體中的緩衝池。innodb的設計類似於oracle,也會在記憶體中開闢一片緩衝池。眾所周知,cpu的速度和磁碟的io速度相差可以用鴻溝來形容,因此聰明的前輩們使用了記憶體這個rom來彌補這道鴻溝,那麼資料庫的設計者們...

innodb的緩衝池(buffer pool)

緩衝區是主記憶體中儲存訪問的表和索引的區域。緩衝池允許經常訪問的資料直接從記憶體處理,更加高效。為了提高大容量讀取操作的效率,緩衝池被劃分為可以容納多行資料的頁 page 為了高效管理快取,緩衝池被實現為頁 page 的列表,快取刪除用lru演算法的變種實現。下圖為緩衝池的結構 head部儲存的是最...

InnoDB原始碼分析 事務日誌(一)

在之前的文章 innodb的wal方式學習 裡,我分析了wal是什麼,觸發時機,最近剛好在看redo log方面的原始碼,就再次聊一聊這方面的事情吧。大家都知道這個引數 innodb flush log at trx commit,該引數用於控制redo buffer中的內容寫入日誌的時機,一般來說...