InnoDB
在 Linux 上使用非同步 I/O 子系統 (原生 AIO) 來執行資料檔案頁面的預讀和寫入請求。此行為由 innodb_use_native_aio
設定選項控制,此選項僅適用於 Linux 系統,並且預設啟用。在其他類 Unix 系統上,InnoDB
僅使用同步 I/O。過去,InnoDB
僅在 Windows 系統上使用非同步 I/O。在 Linux 上使用非同步 I/O 子系統需要 libaio
函式庫。
透過同步 I/O,查詢執行緒將 I/O 請求排隊,而 InnoDB
背景執行緒一次擷取一個排隊的請求,並為每個請求發出同步 I/O 呼叫。當 I/O 請求完成且 I/O 呼叫傳回時,處理請求的 InnoDB
背景執行緒會呼叫 I/O 完成常式,並返回處理下一個請求。可以平行處理的請求數量是 n
,其中 n
是 InnoDB
背景執行緒的數量。InnoDB
背景執行緒的數量由 innodb_read_io_threads
和 innodb_write_io_threads
控制。請參閱 第 17.8.5 節,〈設定背景 InnoDB I/O 執行緒的數量〉。
透過原生 AIO,查詢執行緒會直接將 I/O 請求分派到作業系統,從而消除背景執行緒數量所施加的限制。InnoDB
背景執行緒會等待 I/O 事件以表示已完成的請求。當請求完成時,背景執行緒會呼叫 I/O 完成常式,並繼續等待 I/O 事件。
原生 AIO 的優勢是針對大量 I/O 繫結的系統的可擴展性,這些系統通常在 SHOW ENGINE INNODB STATUS
輸出中顯示許多擱置的讀取和寫入。使用原生 AIO 時平行處理的增加表示 I/O 排程器的類型或磁碟陣列控制器的屬性對 I/O 效能有更大的影響。
對於大量 I/O 繫結的系統,原生 AIO 的一個潛在缺點是無法控制一次分派到作業系統的 I/O 寫入請求的數量。根據 I/O 活動和系統功能,在某些情況下,分派到作業系統以進行平行處理的 I/O 寫入請求太多可能會導致 I/O 讀取匱乏。
如果作業系統中非同步 I/O 子系統的問題阻止 InnoDB
啟動,您可以使用 innodb_use_native_aio=0
啟動伺服器。如果 InnoDB
偵測到潛在問題(例如 tmpdir
位置、tmpfs
檔案系統和 Linux 核心的組合不支援 tmpfs
上的非同步 I/O),此選項也可能會在啟動期間自動停用。