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
檔案系統和不支援在 tmpfs
上進行非同步 I/O 的 Linux 核心的組合,此選項也可能在啟動期間自動停用。