MySQL 配置後臺InnoDB I/O執行緒數

eric0435發表於2022-04-09

配置後臺InnoDB I/O執行緒數
InnoDB使用後臺執行緒來處理各種型別的I/O請求。您可以使用innodb_read_io_threads和innodb_write_io_threads配置引數來配置服務於資料頁讀寫I/O的後臺執行緒數。這些引數分別表示用於讀和寫請求的後臺執行緒數。它們在所有支援的平臺上都是有效的。你可以在MySQL選項檔案(my.cnf或my.ini)中設定這些引數的值;不能動態地更改值。這些引數的預設值是4,允許的值範圍是1-64。

這些配置選項的目的是讓InnoDB在高階系統上更具擴充套件性。每個後臺執行緒最多可以處理256個I/O請求。後臺I/O的一個主要來源是預讀請求。InnoDB試圖平衡傳入請求的負載,使得大多數後臺執行緒都能平等地工作。InnoDB也嘗試將讀請求從相同的extent分配到相同的thread,以增加合併請求的機會。如果你有一個高階的I/O子系統,你在SHOW ENGINE INNODB STATUS輸出中看到超過64個innodb_read_io_threads掛起的讀請求,你可以透過增加innodb_read_io_threads的值來提高效能。

在Linux系統上,InnoDB預設使用非同步I/O子系統來執行資料檔案頁面的預讀和寫請求,這改變了InnoDB後臺執行緒服務這些型別的I/O請求的方式。

在Linux上使用非同步I/O
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控制。

使用本機AIO,查詢執行緒直接將I/O請求分發給作業系統,從而消除了後臺執行緒數量的限制。InnoDB後臺執行緒等待I/O事件來通知完成的請求。當一個請求完成時,後臺執行緒呼叫一個I/O完成例程,然後繼續等待I/O事件。

本機AIO的優勢是可伸縮性,對於I/O繫結嚴重的系統,通常在SHOW ENGINE INNODB STATUS\G輸出中顯示許多掛起的讀/寫。使用本機AIO時並行處理的增加意味著I/O排程器的型別或磁碟陣列控制器的屬性對I/O效能有更大的影響。

本機AIO對於大量I/O繫結的系統的一個潛在缺點是無法控制一次分配給作業系統的I/O寫請求的數量。分派給作業系統進行並行處理的I/O寫請求太多,在某些情況下可能導致I/O讀不足,這取決於I/O活動的數量和系統能力。

如果作業系統中非同步I/O子系統的問題導致InnoDB無法啟動,你可以使用innodb_use_native_aio=0來啟動伺服器。如果InnoDB檢測到一個潛在的問題,比如tmpdir位置,tmpfs檔案系統,以及Linux核心不支援tmpfs上的非同步I/O,這個選項也可以在啟動時自動禁用


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2886311/,如需轉載,請註明出處,否則將追究法律責任。

相關文章