MySQLInnodbbufferpool相关参数
innodb_buffer_pool_chunck_size
buffer pool块⼤⼩,当buffer pool扩容或缩容时,以chunck为单位来进⾏空间resizing。只能在实例重启时修改⽣效。
修改chunck⼤⼩,增加和减少的空间需要是MB的倍数。
如果innodb_buffer_pool_chunck_size*innodb_buffer_pool_instances不能⼤于innodb_buffer_pool_size,也就是只能改⼩。
innodb_buffer_pool_instances
buffer pool可以分为多个⼦pool,称为实例,每个实例都专属的LRU链和相关的数据结构,已达到避免只有⼀个pool时的并发冲突。
innodb_buffer_pool_size
buffer pool总⼤⼩,设定最好是innodb_buffer_pool_instances*innodb_buffer_pool_chunck_size的倍数,否则MySQL会调整为适当的⼤⼩,因为只能按照innodb_buffer_pool_chunck_size来调节。
可以在线动态调整,但是不知道会有什么BUG。
在线调整时,可以通过以下命令查看调整进度:
SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
同样也可以查看error log⾥的调整过程信息,如:
在线增⼤buffer pool的error log
[Note] InnoDB: Resizing buffer pool from 134217728 to 4294967296. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was added.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 134217728 to 4294967296.
[Note] InnoDB: re-enabled adaptive hash index.
在线减⼩buffer pool的error log
[Note] InnoDB: Resizing buffer pool from 4294967296 to 134217728. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : start to withdraw the last 253952 blocks.
[Note] InnoDB: buffer pool 0 : withdrew 253952 blocks from free list. tried to relocate 0 pages.
(253952/253952)
[Note] InnoDB: buffer pool 0 : withdrawn target 253952 blocks.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was freed.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 4294967296 to 134217728.
[Note] InnoDB: re-enabled adaptive hash index.
可以看到resizing过程需要禁⽤⾃适应哈希索引以及resize hash table,那么在线调整的内核原理如下:
1.increase
以chunck为单位增加buffer容量;
将哈希表,链表结构和指针等重定向到新的内存地址;
将新页加到free list。
这些操作由后台线程进⾏,操作过程中其他线程⽆法访问buffer pool。
2.decrease
抽取buffer pool的碎⽚并回收;
以chunck为单位移除页;
将哈希表,链表结构和指针等重定向到新的内存地址。
这些操作由后台线程进⾏,在抽取buffer pool的碎⽚并回收时允许其他线程访问buffer pool,其他过程中buffer pool不允许访问。
所以在线调整buffer pool还是对在线事务有影响。
innodb_old_blocks_pct
MySQL的LRU算法经过优化,将LRU链分为young区和old区,这个参数控制分配多少⽐例给old区,例
如默认值37,即分配⼤概⼋分之三的LRU链给old区使⽤。
可取值5到95。可在线调整。
innodb_old_blocks_time
这个参数控制LRU链中old区的页经过多少毫秒后才移动到young区,如果读取到old区的页⽽该页在old区停留没有超过设定的时间,则不会移动到young区。默认值是1000,即1秒。可在线调整。
通常是⽤于防⽌全表扫描等⼀次性读取对LRU的冲刷,以及避免热数据被⼤量的短期内读的冷数据取代。
设为0时,则old区的数据⼀旦被读取就会移动到young区。
LRU的优先淘汰LRU链尾的页,即old区的末端。
innodb_read_ahead_threshold
线性预读的触发阈值,可取值0到64。默认值是56,意思是当在⼀个extent⾥顺序读取了56个页,那么innodb就会认为很有可能继续顺序读取该extent剩余的页,那么innodb就会把整个extent都异步地预先读取到buffer pool⾥,以备后续需要的时候直接读取内存。
innodb_random_read_ahead
是否开启随机预读,意识是如果innodb发现buffer pool已经有了同属于⼀个extent的13个连续的页,就会把这个extent剩余的页都预先读取到buffer pool⾥。
是否开启⾃适应刷盘调整,默认开启。即⾃动调整刷盘的速度。
什么是刷盘的速度?⽐如⼀段时间内刷100页和有多少脏页就刷多少的区别,就是速度的概念。
innodb会⽤⼀种启发式的算法,根据buffer pool⾥的脏页数量,以及redo⽂件写⼊速度,来控制刷盘速度。
重定向过多是什么意思innodb_adaptive_flushing_lwm
⽇志⽂件使⽤量的百分率低⽔位,当达到这个界限,则会触发⾃适应刷盘,即使没有开启innodb_adaptive_flushing。
默认值10,最⼤值70。
innodb_flush_neighbors
在刷盘时是否把要写⼊磁盘的页所在的区的其他页也⼀起刷盘。
当使⽤HDD硬盘设备时,开启innodb_flush_neighbors可以减少IO压⼒,其实是减少了寻道时间,因为同⼀个extent通常在磁盘上是相邻的页。
⽽对于SSD,寻道时间并不是⼀个影响性能的关键因素,反⽽不需要开启innodb_flush_neighbors。
可取值0,1,2,默认值为1。
0,将邻接块⼀同刷盘的特性关闭;
1,将同⼀个区的所有块⼀同刷盘;
2,只将同⼀个区的赃块⼀同刷盘。
innodb保存之前flush状态的迭代次数,有点拗⼝,意思就是对于⾃适应flush应对负载变化的积极程度,以便能够更顺滑地调整flush速度。
默认值是30,最⼩值1,最⼤值1000。可动态调整。
innodb_lru_scan_depth
每⼀秒钟都会有⼀个后台线程page cleaner thread来扫描LRU上的脏页并刷盘,该参数控制扫描链表的深度,即页数。
默认值1024,最⼩值100。可动态调整。
innodb_max_dirty_pages_pct
buffer pool的脏页⽐例上限,MySQL会通过flush来保持脏页⽐例不超过该设定。默认⾄75,代表75%。可取值0到99。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论