關於MySQL buffer pool的預讀機制

來源:互聯網
上載者:User

標籤:統計資訊   microsoft   穩定性   操作   兩種   variable   logs   使用   檢查   

預讀機制

兩種預讀演算法

  1、線性預讀

  2、隨機預讀

對預讀的監控

一、預讀機制  

  InnoDB在I/O的最佳化上有個比較重要的特性為預讀,預讀請求是一個i/o請求,它會非同步地在緩衝池中預先回遷多個頁面,預計很快就會需要這些頁面,這些請求在一個範圍內引入所有頁面。InnoDB以64個page為一個extent,那麼InnoDB的預讀是以page為單位還是以extent?

 

  資料庫請求資料的時候,會將讀請求交給檔案系統,放入請求隊列中;相關進程從請求隊列中將讀請求取出,根據需求到相關資料區(記憶體、磁碟)讀取資料;取出的資料,放入響應隊列中,最後資料庫就會從響應隊列中將資料取走,完成一次資料讀操作過程。

  接著進程繼續處理請求隊列,(如果資料庫是全表掃描的話,資料讀請求將會佔滿請求隊列),判斷後面幾個資料讀請求的資料是否相鄰,再根據自身系統IO頻寬處理量,進行預讀,進行讀請求的合并處理,一次性讀取多塊資料放入響應隊列中,再被資料庫取走。(如此,一次物理讀操作,實現多頁資料讀取,rrqm>0(# iostat -x),假設是4個讀請求合并,則rrqm參數顯示的就是4)

 

二、兩種預讀演算法

  InnoDB使用兩種預讀演算法來提高I/O效能:線性預讀(linear read-ahead)和隨機預讀(randomread-ahead)

  為了區分這兩種預讀的方式,我們可以把線性預讀放到以extent為單位,而隨機預讀放到以extent中的page為單位。線性預讀著眼於將下一個extent提前讀取到buffer pool中,而隨機預讀著眼於將當前extent中的剩餘的page提前讀取到buffer pool中。

1、線性預讀(linear read-ahead)

  線性預讀方式有一個很重要的變數控制是否將下一個extent預讀到buffer pool中,通過使用配置參數innodb_read_ahead_threshold,控制觸發innodb執行預讀操作的時間。

  如果一個extent中的被順序讀取的page超過或者等於該參數變數時,Innodb將會非同步將下一個extent讀取到buffer pool中,innodb_read_ahead_threshold可以設定為0-64的任何值(因為一個extent中也就只有64頁),預設值為56,值越高,訪問模式檢查越嚴格。

mysql> show variables like ‘innodb_read_ahead_threshold‘;+-----------------------------+-------+| Variable_name               | Value |+-----------------------------+-------+| innodb_read_ahead_threshold | 56    |+-----------------------------+-------+

  例如,如果將值設定為48,則InnoDB只有在順序訪問當前extent中的48個pages時才觸發線性預讀請求,將下一個extent讀到記憶體中。如果值為8,InnoDB觸發非同步預讀,即使程式段中只有8頁被順序訪問。

  可以在MySQL設定檔中設定此參數的值,或者使用SET GLOBAL需要該SUPER許可權的命令動態更改該參數。

  在沒有該變數之前,當訪問到extent的最後一個page的時候,innodb會決定是否將下一個extent放入到buffer pool中。

2、隨機預讀(randomread-ahead)

  隨機預讀方式則是表示當同一個extent中的一些page在buffer pool中發現時,Innodb會將該extent中的剩餘page一併讀到buffer pool中。

mysql> show variables like ‘innodb_random_read_ahead‘;+--------------------------+-------+| Variable_name            | Value |+--------------------------+-------+| innodb_random_read_ahead | OFF   |+--------------------------+-------+

  由於隨機預讀方式給innodb code帶來了一些不必要的複雜性,同時在效能也存在不穩定性,在5.5中已經將這種預讀方式廢棄,預設是OFF。若要啟用此功能,即將組態變數設定innodb_random_read_ahead為ON。

 

三、監控Innodb的預讀

1、可以通過show engine innodb status\G顯示統計資訊

mysql> show engine innodb status\G----------------------BUFFER POOL AND MEMORY----------------------……Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s……

  1、Pages read ahead:表示每秒讀入的pages;

  2、evicted without access:表示每秒讀出的pages;

  3、一般隨機預讀都是關閉的,也就是0。

2、通過兩個狀態值,評估預讀演算法的有效性

mysql> show global status like ‘%read_ahead%‘;+---------------------------------------+-------+| Variable_name                         | Value |+---------------------------------------+-------+| Innodb_buffer_pool_read_ahead_rnd     | 0     || Innodb_buffer_pool_read_ahead         | 2303  || Innodb_buffer_pool_read_ahead_evicted | 0     |+---------------------------------------+-------+3 rows in set (0.01 sec)

  1、Innodb_buffer_pool_read_ahead:通過預讀(後台線程)讀入innodb buffer pool中資料頁數

  2、Innodb_buffer_pool_read_ahead_evicted:通過預讀來的資料頁沒有被查詢訪問就被清理的pages,無效預讀頁數

關於MySQL buffer pool的預讀機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.