innodb之change buffer主动merge

一、srv0srv.cc:: srv_master_thread

说明:

1、  主线程有3种状态:ACTIVE、IDLE、SHUTDOWN状态

2、  ACTIVE:srv_master_do_active_tasks()

3、 IDLE:srv_master_do_idle_tasks()

4、  SHUTDOWN:srv_master_do_shutdown_tasks

1、srv_master_thread

while (srv_shutdown_state ==SRV_SHUTDOWN_NONE) {

srv_master_sleep();

MONITOR_INC(MONITOR_MASTER_THREAD_SLEEP);

srv_current_thread_priority= srv_master_thread_priority;

if(srv_check_activity(old_activity_count)) {

old_activity_count= srv_get_activity_count();

srv_master_do_active_tasks();//active状态

}else {

srv_master_do_idle_tasks();//idle状态

}

}

while (srv_master_do_shutdown_tasks(&last_print_time)){//shutdown状态

/*Shouldn‘t loop here in case of very fast shutdown */

ut_ad(srv_fast_shutdown< 2);

}

//注意这里的循环:srv_master_do_shutdown_tasks循环做,做完全部任务,没有可做的东西时才退出。

2、srv_master_do_active_tasks()

说明:

1、ibuf_contract_in_background函数的第二个参数是false

/*Do an ibuf merge */

srv_main_thread_op_info= "doing insert buffer merge";

counter_time= ut_time_us(NULL);

ibuf_contract_in_background(0, FALSE);

MONITOR_INC_TIME_IN_MICRO_SECS(

MONITOR_SRV_IBUF_MERGE_MICROSECOND,counter_time);

3、srv_master_do_idle_tasks()

……

/* Do an ibuf merge */

counter_time= ut_time_us(NULL);

srv_main_thread_op_info= "doing insert buffer merge";

ibuf_contract_in_background(0, TRUE);

MONITOR_INC_TIME_IN_MICRO_SECS(

MONITOR_SRV_IBUF_MERGE_MICROSECOND,counter_time);

……

4、ibuf0ibuf.cc::ibuf_contract_in_background

功能:

通过读取pages到buffer pool收缩insert buffer trees

输入参数:

table_id:如果merge操作在指定的表上。当0时表示所有表

full:TRUE表示caller要做fullcontract基于PCT_IO(100)

FALSE表示基于ibuf tree的大小进行

说明:

1、  当full是true时,n_pages=PCT_IO(100),即srv_io_capacity的100%

2、  当full是false时,根据ibuf tree大小决定merge多少页

n_pages=PCT_IO(5)

当ibuf->size大于ibuf->max_size/2时

diff=ibuf->size – ibu->max_size/2

n_pages=n_pages+PCT_IO( )

ibuf->max_size+1是为了避免除以0.

……

if (full) {

/*Caller has requested a full batch */

n_pages = PCT_IO(100);

} else {

/*By default we do a batch of 5% of the io_capacity */

n_pages= PCT_IO(5);

if (ibuf->size > ibuf->max_size / 2) {

ulintdiff = ibuf->size - ibuf->max_size / 2;

n_pages += PCT_IO((diff * 100) /(ibuf->max_size + 1));

}

}

//真正merge操作由下面循环完成

while (sum_pages < n_pages) {

ulint n_bytes;

n_bytes = ibuf_merge(table_id, &n_pag2, FALSE);

if(n_bytes == 0) {

return(sum_bytes);

}

sum_bytes+= n_bytes;

sum_pages+= n_pag2;

}

5、srv_master_do_shutdown_tasks

说明:

1、一次srv_master_do_shutdown_tasks以100%的io capacity进行merge。可能一次merge不完。不要紧,merge一次成功则n_bytes_merged不为0,那么退出,到下次循环时就是TRUE,仍旧在shutdown tasks循环里

……

/* Do an ibuf merge */

srv_main_thread_op_info= "doing insert buffer merge";

n_bytes_merged = ibuf_contract_in_background(0, TRUE);

……

return(n_bytes_merged || n_tables_to_drop);

二、总结:主动merge

主动merge在master线程中,主要分3种情况:

1、  IDLE:实例处于空闲状态,以100%的io capacity来做merge操作。相当于一次merge的page数等于innodb_io_capacity

2、  ACTIVE:实例处于活跃状态,这个时候回以如下算法计算需要merge的页数:

n_pages = PCT_IO(5);

if (ibuf->size >ibuf->max_size / 2) {

ulint diff = ibuf->size -ibuf->max_size / 2;

n_pages += PCT_IO((diff * 100) / (ibuf->max_size + 1));

}

可见系统ACTIVE时回以比较温和的方式做merge,如果当且ibuftree size超过最大值的一半,则尝试你多做一些merge操作。

3、SHUTDOWN:当执行slow shutdown时,会强制做一次全部的ibuf merge

问题:

1、如何判读master线程处于idle状态还是处于active状态?

1)Srv0srv.cc::srv_inc_activity_count函数完成the server activity count+1

这个函数在所有任务线程中都有调用。例如:

srv_master_do_active_tasks

ibuf_contract_in_background(0,FALSE);//xtradb有,innodb没有,innodb可能在//ibuf_merge中吧

while(sum_pages < n_pages) {

n_bytes = ibuf_merge(table_id,&n_pag2, FALSE);

srv_inc_activity_count();

}

2)主线程每隔1秒,使用srv_check_activity进行比较。如果srv_sys->activity_count没有变则认为是idle。

srv_master_thread

……

while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {

srv_master_sleep();//1秒

……

if(srv_check_activity(old_activity_count)) {

old_activity_count= srv_get_activity_count();

srv_master_do_active_tasks();

}else {

srv_master_do_idle_tasks();

}

}

srv_check_activity(old_activity_count)

return(srv_sys->activity_count != old_activity_count);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 22:51:05

innodb之change buffer主动merge的相关文章

innodb之change buffer被动merge

被动merge情景一,二级索引页空间不足:ibuf0ibuf.cc:: ibuf_insert_low 1.当尝试缓存插入操作时,如果预估二级索引page的空间不足,可能导致索引分裂,则定位到尝试缓存的page no在ibuf tree中的位置,最多merge 8个page,merge方式为异步,即发起异步读取索引页请求. 说明: Buffered:当前二级索引页已经缓存的记录 entry_size:待插入的二级索引记录大小 page_dir_calc_reserved_space(1):待插入

InnoDB关键特性之change buffer

一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主键来访问MySQL表的性能是最好: 1.显式定义主键:primary key 2.隐式定义主键:如果没有指定主键,MySQL自己会默认建立一个主键(rowid隐藏主键) 1.特点 1.表按照主键排好序,数据按照主键顺序存放(核心原因) 2.主键上有一棵树,叶子节点就是数据节点 3.表本身就是索引,表

insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控

https://yq.aliyun.com/articles/41000 http://blog.itpub.net/22664653/viewspace-1163838/ http://www.cnblogs.com/MYSQLZOUQI/p/5602206.html https://yq.aliyun.com/articles/222 主从不一致性的3种可能原因1.binlog format是不是row2.session级关闭binlog3.人工在slave修改数据 set sql_log_

mysql-5.7 innodb change buffer 详解

一.innodb change buffer 介绍: 1.innodb change buffer 是针对oltp场景下磁盘IO的一种优化(我也感觉这个不太像人话,但是它又非常的准确的说明 innodb change buffer 的功能) 二.innodb change buffer 原理: 对于insert ,update ,delete 操作一来要更新数据,二来要更新索引:如果要更新的索引页还没有在内存中,那么innodb 不会急于把索引页调入内存,更新,再写回磁盘:它会先把对索引的更新这

Change Buffer与innodb_force_recovery=4

一.关于innodb_force_recovery 熟悉mysql的人一定熟悉innodb_force_recovery这个参数,如果数据库crash,再次启动的时候innodb会对innodb表进行恢复,恢复成功,数据库正常启动,如果恢复失败,数据库将无法启动.根据经验,innodb_force_recovery=4这个参数相当管用,最近用于恢复了一个数据库,步骤网上都有: 1.在/etc/my.cnf中增加: [mysqld]innodb_force_recovery = 42.重启MySQ

MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转

应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO. 今天,和大家聊一聊InnoDB的缓冲池. InnoDB的缓冲池缓存什么?有什么用? 缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用. 速度快,

普通索引和唯一索引如何选择(谈谈change buffer)

假设有一张市民表(本篇只需要用其中的name和id_card字段,有兴趣的可以翻看“索引”篇,里面有建表语句) 每个人都有一个唯一的身份证号,且业务代码已经保证不会重复. 由于业务需求,市民需要按身份证查找对应姓名,即执行如下sql select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz'; 我们自然会想在id_card上建索引.因为该字段较大,一般不建议直接作为主键. 于是我们面临选择:是建普通索引还是唯一索引——结合前面的背景说明

MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)

15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to secondary index pages when affected pages are not in the buffer pool. The buffered changes, which may result from INSERT, UPDATE, or DELETE operations (DM

Mysql InnDB 内存存储结构 -- Change Buffer

在InnoDB中,当对应的数据不存在与Buffer Pool中时,为了避免大量的随机磁盘I/O可能带来的性能瓶颈,InnoDB 在Buffer Pool 中划分出一部分内存,称为Change Buffer,由其负责缓存由DML操作引起的二级索引相关数据的变化.当对应的数据下次被读入Buffer Pool 中时,Change Buffer 中记录的变化信息会被合并到数据中.其结构如下图所示.简要的,使用Change Buffer有三个要点:a. DML操作, b. 涉及二级索引,c. 对应page