天天看点

mysql控制innodb buffer pool

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控制