From 1e3a90a43056135e00aca0c7b7086a2afc15a36f Mon Sep 17 00:00:00 2001 From: asahi Date: Tue, 3 Dec 2024 12:49:14 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBbuffer=20pool=20flush?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/innodb体系结构.md | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md index 2ac91a3..8b3b5ed 100644 --- a/mysql/mysql文档/innodb体系结构.md +++ b/mysql/mysql文档/innodb体系结构.md @@ -253,3 +253,32 @@ sync_water_mark = 0.9 * total_redo_log_file_size `sync/async flush checkpoint`操作同样放入到了page cleaner线程中,不会阻塞用户操作 +> redo异步刷新的水位线为`0.75`,同步刷新的水位线为`0.9` +> +> 当`redo_lsn - checkpoint`的大小超过异步或同步水位线时,会把足够的脏页刷新到磁盘中,刷新后满足`redo_lsn - checkpoint < async_water_mark` + +#### Dirty Page too Much +如果buffer中存在的脏页数量过多,那么会触发innodb强制进行脏页刷新,将脏页刷新到磁盘。 + +## Buffer pool刷新 +innodb会在后台将脏页刷新到磁盘中。在innodb中,buffer pool刷新由page cleaner thread来执行。 + +> ### page cleaner threads +> page cleaner threads的数量由`innodb_page_cleaners`变量来控制,该变量存在默认值,默认值为`innodb_buffer_pool_instances`的值。 + +### innodb_max_dirty_pages_pct_lwm +当buffer pool中的脏页比例达到`innodb_max_dirty_pages_pct`的百分比时,将会触发buffer pool刷新操作。 + +`innodb_max_dirty_pages_pct_lwm`的默认值为`10%`,如果将该变量的值设置为0,那么将会禁用该刷新行为。 + +当配置`innodb_max_dirty_pages_pct_lwm`变量时,应该确保该变量的值小于`innodb_max_dirty_pages_pct`的值。 + +### innodb_lru_scan_depth +`innodb_lru_scan_depth`该变量制定了每个缓冲池实例中,page cleaner在扫描lru列表时待刷新脏页的深度。该后台操作由page cleaner thread每秒执行一次。 + +> 若增加`innodb_lru_scan_depth`的值,在用户线程IO的基础上,会额外增加IO的负载。只有在工作负载之外存在空闲IO容量时,才考虑增加该变量的值。 +> +> 如果工作负载已经令IO容量饱和,那么可以考虑减少`innodb_lru_scan_depth`的大小。 +> +> `该变量默认值大小为1024`。 +