天天看點

innodb 的預讀

innodb在io的優化上有個比較重要的特性為預讀,innodb以64個page為一個extent,那麼innodb的預讀是以page為機關還是以extent?

這樣就進入了下面的話題:linear read-ahead和randomread-ahead;

為了區分這兩種預讀的方式,我們可以把linear預讀放到以extent為機關,而random 預讀放到以extent中的page為機關;

linear 預讀着眼于将下一個extent提前讀取到buffer pool中,

而random預讀着眼于将目前extent中的剩餘的page提前讀取到buffer pool 中:

innodb 的預讀

linear的預讀方式有一個很重要的變量控制是否将下一個extent預讀到buffer pool中:innodb_read_ahead_threshold:如果一個extent中的被順序讀取的page超過或者等于該參數變量的,innodb将會異步的将下一個extent讀取到buffer pool中,比如該參數的值為30,那麼當該extent中有30個pages 被 sequentially的讀取,則會觸發innodb linear預讀,将下一個extent讀到記憶體中;在沒有該變量之前,當通路到extent的最後一個page的時候,innodb會決定是否将下一個extent放入到buffer pool中;

該參數可以動态的修改:

root@(none) 09:20:02>set global innodb_read_ahead_threshold=40;

query ok, 0 rows affected (0.00 sec)

random的預讀方式則是表示當同一個extent中的一些page在buffer pool中發現時,innodb會将該extent中的剩餘page一并讀到buffer pool中,由于random的預讀方式給innodb code帶來了一些不必要的複雜性,同時在性能也存在不穩定性,在5.5中已經将這種預讀方式廢棄。

在監控innodb的預讀時候,我們可以通過show innodb status中的 pages read ahead和evicted without access 兩個值來觀察預讀的情況:

或者通過兩個狀态值:

innodb_buffer_pool_read_ahead 和 innodb_buffer_pool_read_ahead_evicted.

innodb_buffer_pool_read_ahead:表示通過預讀請求到buffer pool的pages;

innodb_buffer_pool_read_ahead_evicted:表示由于請求到buffer pool中沒有被通路,而驅逐出buffer pool的pages;

root@(none) 10:19:42>show global status like ‘%read_ahead%’;

+—————————————+———+

| variable_name | value |

| innodb_buffer_pool_read_ahead | 775378 |

| innodb_buffer_pool_read_ahead_evicted | 1888537 |

而通過show innodb status得到的 pages read ahead 和evicted without access 則表示每秒讀入和讀出的pages;

pages read ahead 1.00/s, evicted without access 9.99/s.

ref:

繼續閱讀