InnoDB儲存引擎——非同步IO

readyao發表於2017-03-14

為了提高磁碟操作效能,當前的資料庫系統都採用非同步IO(Asynchronous IO,AIO)的方式來處理磁碟操作。InnoDB儲存引擎就是這樣。

AIO的概念

與AIO對應的Sync IO,即每進行一次IO操作,需要等待此操作結束才能繼續接下來的操作。但是如果使用者發出的是一條索引掃描的查詢,那麼這條SQL查詢語句可能需要掃描多個索引頁,也就是需要進行多次的IO操作。在每掃描一個頁並等待其完成後再進行下一次的掃描,這是沒有必要的。使用者可以在發出一個IO請求後立即再發出另一個IO請求,當全部IO請求傳送完畢後,等待所有IO操作的完成,這就是AIO。

IO Merge

AIO另一個優勢是進行IO Merge操作,也就是將多個IO合併為1個IO,這樣可以提高IOPS的效能。例如使用者需要訪問頁的(space, offset)為:
(8,6),(8,7),(8,8)
每個頁的大小為16KB,那麼同步IO需要進行3次IO操作。而AIO會判斷到這三個頁是連續的(可以通過(space,offset)知道)。因此AIO底層會傳送一個IO請求,從(8,6)開始,讀取48KB的頁。

root@TryHard:~# iostat
Linux 3.13.0-65-generic (TryHard)       03/14/2017      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.11    0.00    0.23    0.02    0.10   99.54

Device:         tps    kB_read/s     kB_wrtn/s  kB_read    kB_wrtn
xvda            0.31      0.17       2.65       1464569     22747260

在InnoDB1.1.x之前,AIO的實現是通過InnoDB儲存引擎中的程式碼來模擬實現。從InnoDB1.1.x開始,提供了核心級別AIO的支援,稱為Native AIO。因此在編譯或者執行該版本的MySql時,需要libaio庫的支援。

Native AIO需要作業系統提供支援,Windows和Linux系統都提供Native AIO支援,而Mac OSX系統則未提供。

引數innodb_use_native_aio用來控制是否啟動Native AIO,在Linux系統下,預設值為ON。

mysql> show variables like 'innodb_use_native_aio';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_use_native_aio | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

使用者可以通過開啟和關閉Native AIO功能來比較InnoDB效能的提升。官方的測試顯示,啟動Native AIO,恢復速度可以提高75%。
在InnoDB儲存引擎中,read ahead方式的讀取都是通過AIO完成,髒頁的重新整理,即磁碟的寫入操作則全部由AIO完成。

相關文章