youzirourou

MySQL是单进程多线程的结构,主要后台线程如下:

1.master:master线程有分四个1.loop(主循环) ,2.backgroup loop(后台循环),3.flush loop(刷新循环) 4.suspend loop(暂停循环)

loop循环也分1S和10S(时间不一定准确,跟系统压力有一定关系)

1S的操作:

刷新缓冲日志到磁盘,即使没有提交(总是)

合并插入(可能) 根据参数判断,具体判断如下:如果前一秒的io数量小于5% innodb_io_capacity 就进行合并,理由是觉得系统比较空闲

                                                                                如果前一秒io数量大于5% innodb_io_capacity 不进行合并

最多刷新全部脏页到磁盘 根据参数,具体判断如下:如果 innodb_max_dirty_pages_pct 大于buf_get_modified_ratio_pct  不刷新

                                                                                    如果 innodb_max_dirty_pages_pct 小于于buf_get_modified_ratio_pct  刷新

切换到backgroup loop(可能,系统不忙时候)

伪代码如下:

void master_thread(){

goto loop;

loop:

for (int i=0;i<10;i++){

thread_sleep(1) //sleep 1 second-->每秒执行操作(负载在情况下会延迟)

do log buffer flush to disk //重做日志缓冲刷新到磁盘,即使这个事务没有提交(总是)

if ( last_ten_second_ios < 5% innodb_io_capacity) //如果当前的10次数小于(5% * 200=10)(innodb_io_capacity默认值是200)

do merger 5% innodb_io_capacity insert buffer //执行10个合并插入缓冲的操作(5% * 200=10)

if ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct ) //如果缓冲池中的脏页比例大于innodb_max_dirty_pages_pct(默认是75时)

do buffer pool plush 100% innodb_io_capacity dirty page //刷新200个脏页到磁盘

else if enable adaptive flush //如果开户了自适应刷新

do buffer pool flush desired amount dirty page //通过判断产生redo log的速度决定最合适的刷新脏页的数量

if ( no user activity ) //如果当前没有用户活动

goto backgroud loop //跳到后台循环

10S的操作:

刷新缓冲日志到磁盘,即使没有提交(总是)

合并插入(总是)

删除无用的undo(总是) 数量判断:innodb_purge_batch_size

刷新脏页总是  刷新数量的判断:buf_get_modified_ratio_pct   大于70%  100%;小于70%  10%。

伪代码如下:

if ( last_ten_second_ios < innodb_io_capacity) //如果过去10内磁盘IO次数小于设置的innodb_io_capacity的值(默认是200)

do buffer pool flush 100% innodb_io_capacity dirty page //刷新脏页的数量为innodb_io_capacity的值(默认是200)

do merger 5% innodb_io_capacity insert buffer //合并插入缓冲是innodb_io_capacity的5%(10)(总是)

do log buffer flush to disk //重做日志缓冲刷新到磁盘,即使这个事务没有提交(总是)

do full purge //删除无用的undo页 (总是)

if (buf_get_modified_ratio_pct > 70%) //如果缓冲池中的胜页比例大于70%

do buffer pool flush 100% innodb_io_capacity dirty page //刷新200个脏页到磁盘

else

do buffer pool flush 10% innodb_io_capacity dirty page //否则刷新20个脏页到磁盘

backgroup loop,flush loop,suspend 伪代码如下:

goto loop

backgroud loop: //后台循环

do full purge //删除无用的undo页 (总是)

do merger 5% innodb_io_capacity insert buffer //合并插入缓冲是innodb_io_capacity的5%(10)(总是)

if not idle: //如果不空闲,就跳回主循环,如果空闲就跳入flush loop

goto loop: //跳到主循环

else:

goto flush loop

flush loop: //刷新循环

do buf_get_modified_ratio_pct pool flush 100% innodb_io_capacity dirty page //刷新200个脏页到磁盘

if ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct ) //如果缓冲池中的脏页比例大于innodb_max_dirty_pages_pct的值(默认75%)

goto flush loop //跳到刷新循环,不断刷新脏页,直到符合条件

goto suspend loop //完成刷新脏页的任务后,跳入suspend loop

suspend loop:

suspend_thread() //master线程挂起,等待事件发生

waiting event

goto loop;

}

 

2.io  --------1.log(1个),2insert(1),3.write(4个,参数:innodb_write_io_threads),4 read(4个innodb_read_io_threads)

3.purge thread----默认4个(innodb_purge_threads)

4.page clean thread----刷新脏页

分类:

技术点:

相关文章:

  • 2021-10-27
  • 2021-08-08
  • 2021-12-23
  • 2021-12-23
  • 2021-12-23
  • 2021-12-23
猜你喜欢
  • 2021-05-22
  • 2022-03-03
  • 2022-01-28
  • 2022-12-23
  • 2021-06-24
  • 2021-12-23
  • 2021-12-23
相关资源
相似解决方案