Mysql

你如何調整 innodb_read_io_threads?

  • September 12, 2021

innodb_read_io_threads和的預設值為innodb_write_io_threads4。如何檢查伺服器負載是否需要更高數量的執行緒?

正如我經常檢查的那樣show engine innodb status \G,沒有可追踪的活動:

--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
...
I/O thread 32 state: waiting for completed aio requests (write thread)
I/O thread 33 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] , aio writes: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ,

此外,將其增加到最大值 64 的缺點是什麼?如果不使用,它們是無害的空閒執行緒。

Pending normal aio reads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] , aio writes: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ,

這些數字對應於您的讀取執行緒和寫入執行緒。你可以看到它們都為零。這意味著所有 I/O 都已處理完畢,即沒有等待空閒執行緒的排隊 I/O 請求。所以不需要增加執行緒數。

如果您經常在該行中看到非零值,則可能意味著您的 I/O 活動繁重,以至於您現有的執行緒無法滿足需求。

根據我的經驗,對於任何數據庫伺服器來說,如此不堪重負的 I/O 請求是非常不尋常的。在幾乎所有情況下,預設執行緒數足以輕鬆處理負載。此外,每個執行緒可以同時處理多個 I/O 請求,因為它使用非同步 I/O。

即使您的數據庫伺服器不需要它,增加更高的執行緒數也沒有太大的缺點。這只是意味著會有更長的 0 行。但這不是必需的。

作為一般規則,我希望盡可能少地對 MySQL 配置文件進行必要的更改。對所有內容都使用預設值,除非有真正的理由要更改它。

如果您將這些配置選項設置得更高,那麼最終,您團隊的新成員會問:“為什麼 innodb_*_io_threads 值設置得這麼高?” 並且您將不得不再次解釋為什麼您認為提高不需要提高的配置值如此重要。

引用自:https://dba.stackexchange.com/questions/299461