buffer pool的重新整理是由page_cleaners線程操作的,這個線程的數量由innodb_page_cleaner控制數量,innodb_max_dirty_pages_pct_lwm 這個參數是髒頁的最低水位線,達到這個值後,會啟動重新整理,預設0,不會啟動提前的重新整理。innodb_max_dirty_pages_pct_lwm這個參數就是來提前重新整理髒頁用的。
mysql的主線程會在背景進行髒頁的重新整理,如果在buffer pool中的髒頁超過了innodb_max_dirty_pages_pct的比例後,innodb會聚合重新整理.
innodb使用基于redo生成的速度和目前重新整理頻率的算法去評估重新整理率, 自動調整重新整理頻率能幫助避免當大量的重新整理限制了對于普通讀寫操作的io能力而導緻的吞吐的突然下降。
自動調整頻率可以通過innodb_adaptive_flushing配置關閉掉,預設是開啟的狀态。
innodb_flush_neighbors 這個參數是刷髒頁的時候也把相鄰的頁刷出去,在hdd的時候有用,在ssd的情況下不用設定。
innodb_lru_scan_depth這個參數指定的是針對每一個buffer pool size page cleaner線程刷多遠的髒頁,每秒執行一次,在寫入負載高的情況下,考慮減小這個參數的設定,尤其是針對大的buffer pool, 這個參數的調整方法是從小到大調整,讓free 的頁最小為目标。
innodb_flushing_avg_loops定義InnoDB保留先前計算的重新整理狀态快照的疊代次數,控制自适應重新整理對前台工作負載變化的響應速度。較高的innodb_flushing_avg_loops值表示InnoDB将先前計算的快照保留的時間更長,是以自适應重新整理的響應速度更慢。設定高值時,重要的是要確定重做日志使用率不達到75%(異步重新整理開始的寫死限制,為什麼不能超過75%,超過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使用自适應重新整理算法根據重做日志生成的速度和目前重新整理率動态調整重新整理率。目的是通過確定重新整理活動與目前工作負載保持同步來使總體性能平穩。自動調整重新整理率有助于避免吞吐量突然下降,當由于緩沖池重新整理而導緻的I / O活動突發影響普通讀取和寫入活動可用的I / O容量時,吞吐量可能會突然下降。
例如,尖銳的檢查點通常與産生大量重做條目的寫密集型工作負載相關聯,可能導緻吞吐量的突然變化。當InnoDB要重用部分日志檔案時,将出現一個尖銳的檢查點。在執行此操作之前,必須清除日志檔案該部分中所有具有重做條目的髒頁。如果日志檔案已滿,則會出現尖銳的檢查點,進而導緻吞吐量暫時降低。即使未達到innodb_max_dirty_pages_pct門檻值,也會發生這種情況。
自适應重新整理算法通過跟蹤緩沖池中的髒頁數和生成重做日志記錄的速率來幫助避免此類情況。根據此資訊,它決定每秒從緩沖池重新整理多少髒頁,進而允許它管理工作負載的突然變化。
innodb_adaptive_flushing_lwm變量為重做日志容量定義了一個低水位線。超過該門檻值時,即使禁用了innodb_adaptive_flushing變量,也會啟用自适應重新整理。
innodb buffer有多個instance,每個instance都有自己的lru? 怎麼去找資料塊的?會去掃描每個instance?怎麼保證速度的?
page跟block什麼關系?
block
/** The buffer control block structure */
struct buf_block_t
buffer
/** The common buffer control block structure
for compressed and uncompressed frames */
/** Number of bits used for buffer page states. */
#define BUF_PAGE_STATE_BITS 3
class buf_page_t
page屬于block block有lock控制