InnoDB
在背景中執行某些工作,包括從緩衝池中刷新髒頁面。髒頁面是指已修改但尚未寫入磁碟上的資料檔案的頁面。
緩衝池刷新由頁面清除程式執行緒執行。頁面清除程式執行緒的數量由 innodb_page_cleaners
變數控制,其預設值設定為與 innodb_buffer_pool_instances
相同的值。
當髒頁面的百分比達到由 innodb_max_dirty_pages_pct_lwm
變數定義的低水位標記值時,會啟動緩衝池刷新。預設的低水位標記是緩衝池頁面的 10%。innodb_max_dirty_pages_pct_lwm
值為 0 會停用此早期刷新行為。
innodb_max_dirty_pages_pct_lwm
閾值的目的是控制緩衝池中髒頁面的百分比,並防止髒頁面的數量達到由 innodb_max_dirty_pages_pct
變數定義的閾值,其預設值為 90。InnoDB
如果緩衝池中髒頁面的百分比達到 innodb_max_dirty_pages_pct
閾值,則會積極刷新緩衝池頁面。
設定 innodb_max_dirty_pages_pct_lwm
時,該值應始終低於 innodb_max_dirty_pages_pct
值。
其他變數允許微調緩衝池刷新行為
innodb_flush_neighbors
變數定義從緩衝池刷新頁面是否也會刷新相同範圍中的其他髒頁面。預設設定 0 會停用
innodb_flush_neighbors
。不會刷新相同範圍中的髒頁面。建議將此設定用於非旋轉儲存 (SSD) 裝置,其中尋找時間不是一個重要因素。設定為 1 會刷新相同範圍中的連續髒頁面。
設定為 2 會刷新相同範圍中的髒頁面。
當資料表資料儲存在傳統 HDD 儲存裝置上時,與在不同時間刷新個別頁面相比,在一次作業中刷新相鄰頁面可減少 I/O 額外負荷(主要針對磁碟尋找作業)。對於儲存在 SSD 上的資料表資料,尋找時間不是一個重要因素,您可以停用此設定以分散寫入作業。
innodb_lru_scan_depth
變數指定每個緩衝池執行個體,頁面清除程式執行緒在緩衝池 LRU 清單中掃描多深,以尋找要刷新的髒頁面。這是頁面清除程式執行緒每秒執行一次的背景作業。小於預設的設定通常適用於大多數工作負載。值明顯高於必要值可能會影響效能。只有在典型工作負載下有額外 I/O 容量時,才考慮增加該值。相反地,如果寫入密集型工作負載使您的 I/O 容量飽和,則減少該值,尤其是在大型緩衝池的情況下。
在調整
innodb_lru_scan_depth
時,請從較低的值開始,然後向上調整設定,目標是很少看到零個可用頁面。此外,當變更緩衝池實例的數量時,也請考慮調整innodb_lru_scan_depth
,因為innodb_lru_scan_depth
*innodb_buffer_pool_instances
定義了頁面清理器執行緒每秒執行的工作量。
innodb_flush_neighbors
和 innodb_lru_scan_depth
變數主要用於寫入密集型工作負載。在大量 DML 活動的情況下,如果刷新不夠積極,可能會延遲刷新,或者如果刷新過於積極,磁碟寫入可能會使 I/O 容量飽和。理想的設定取決於您的工作負載、資料存取模式和儲存配置(例如,資料是儲存在 HDD 還是 SSD 裝置上)。
InnoDB
使用自適應刷新演算法,根據重做日誌的產生速度和當前的刷新速率動態調整刷新速率。目的是透過確保刷新活動與當前的工作負載保持同步,來平滑整體效能。自動調整刷新速率有助於避免因緩衝池刷新導致 I/O 活動突增,進而影響可用於普通讀寫活動的 I/O 容量而造成的吞吐量突然下降。
例如,通常與產生大量重做條目的寫入密集型工作負載相關的快速檢查點可能會導致吞吐量的突然變化。當 InnoDB
想要重複使用日誌檔的一部分時,就會發生快速檢查點。在此之前,必須刷新該日誌檔部分中具有重做條目的所有髒頁。如果日誌檔已滿,就會發生快速檢查點,導致吞吐量暫時降低。即使未達到 innodb_max_dirty_pages_pct
閾值,也可能會發生這種情況。
自適應刷新演算法透過追蹤緩衝池中的髒頁數量以及重做日誌記錄的產生速率,來幫助避免這種情況。基於此資訊,它會決定每秒從緩衝池中刷新多少髒頁,這使其能夠管理工作負載的突然變化。
innodb_adaptive_flushing_lwm
變數定義了重做日誌容量的低水位標記。當超過該閾值時,即使停用了 innodb_adaptive_flushing
變數,也會啟用自適應刷新。
內部基準測試顯示,該演算法不僅可以隨著時間的推移維持吞吐量,還可以顯著提高整體吞吐量。但是,自適應刷新可能會顯著影響工作負載的 I/O 模式,並且可能不適用於所有情況。當重做日誌有填滿的風險時,它會帶來最大的好處。如果自適應刷新不適合您的工作負載特性,您可以將其停用。自適應刷新由 innodb_adaptive_flushing
變數控制,預設為啟用。
innodb_flushing_avg_loops
定義了 InnoDB
保留先前計算的刷新狀態快照的迭代次數,控制自適應刷新對前台工作負載變化的反應速度。較高的 innodb_flushing_avg_loops
值表示 InnoDB
保留先前計算的快照的時間更長,因此自適應刷新的回應速度較慢。設定較高的值時,請務必確保重做日誌使用率未達到 75%(非同步刷新的硬編碼限制),並且 innodb_max_dirty_pages_pct
閾值將髒頁的數量保持在適合工作負載的水平。
具有一致工作負載、較大日誌檔大小 (innodb_log_file_size
) 以及未達到 75% 日誌空間使用率的小峰值的系統,應使用較高的 innodb_flushing_avg_loops
值,以盡可能保持刷新平穩。對於具有極端負載峰值或無法提供大量空間的日誌檔的系統,較小的值允許刷新緊密追蹤工作負載的變化,並有助於避免達到 75% 的日誌空間使用率。
請注意,如果刷新延遲,緩衝池的刷新速率可能會超過 InnoDB
可用的 I/O 容量,如 innodb_io_capacity
設定所定義。在這種情況下,innodb_io_capacity_max
值定義了 I/O 容量的上限,以便 I/O 活動的峰值不會消耗伺服器的全部 I/O 容量。
innodb_io_capacity
設定適用於所有緩衝池實例。刷新髒頁時,I/O 容量在緩衝池實例之間平均分配。
innodb_idle_flush_pct
變數限制了閒置期間(即未修改資料庫頁面的時間段)的緩衝池刷新速率。其值被解釋為 innodb_io_capacity
的百分比(它定義了 InnoDB
可用的每秒 I/O 操作數)。預設值為 100,或 innodb_io_capacity
值的 100%。若要限制閒置期間的刷新,請將 innodb_idle_flush_pct
設定為小於 100 的值。
限制閒置期間的頁面刷新可以幫助延長固態儲存裝置的壽命。限制閒置期間的頁面刷新可能會產生的副作用包括,在長時間閒置後關機時間會較長,以及如果發生伺服器故障,復原時間會較長。