美文网首页
InnoDB 1.0.x版本之前的Master Thread

InnoDB 1.0.x版本之前的Master Thread

作者: 噜噜迅儿 | 来源:发表于2017-10-31 22:37 被阅读0次

Master Thread具有最高的线程优先级。其内部由多个循环(loop)组成:loop、background loop、flush loop、suspend loop。

Loop被称为主循环,其中有两大部分操作——每秒的操作和每10秒的操作:
do thing once per second:

  • 日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)
  • 合并插入缓冲(可能)
    if 最近1秒内发生的IO次数< 5:
    合并插入缓冲
  • 至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)
    if 当前缓冲池中脏页(buf_get_modified_ratio_pc)的比例大于innodb_max_dirty_pages_pct[90]
    将100个脏页写入磁盘中
  • 如果当前没有用户活动,则切换到background loop(可能)

do things once per ten seconds:

  • 刷新100个脏页到磁盘(可能的情况下)
    if 最近10秒内发生的IO次数< 200:
    将100个脏页写入磁盘中
  • 合并至多5个插入缓冲(总是)
  • 将日志缓冲刷新到磁盘(总是)
  • 删除无用的Undo页(总是)
    每次最多尝试回收20个undo页
  • 刷新100个或者10个脏页到磁盘(总是)
void master_thread() {
    goto loop;
    loop:
        // do thing once per second
        for (int i=0; i<10; i++) {
            thread_sleep(1)     // sleep 1 second
            do log buffer flush to disk
            if (last_one_second_ios <5)
                do merge at most 5 insert buffer
            if (buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct[90])
                do buffer pool flush 100 dirty page 
            if (no user activity)
                goto backgroup loop;
        }
    // do things once per ten seconds
    if (last_ten_second_ios <200)
        do buffer pool flush 100 dirty page
    do merge at most 5 insert buffer
    do log buffer flush to disk
    do full purge
    if (buf_get_modified_ratio_pct > 70%)
        do buffer pool flush 100 dirty page
    else
        do buffer pool flush 10 dirty page
    goto loop;
    backgroud loop:
        do full purge
        do merge 20 insert buffer
        if not idle:
            goto loop;
        else
            goto flush loop;
    flush loop:
        do buffer pool flush 100 dirty page
        if (buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct[90])
            goto flush loop;
        goto suspend loop;
    suspend loop:
        suspend_thread()
        waiting event;
        goto loop;
}

backgound loop会执行以下操作:

  • 删除无用的Undo页(总是)
  • 合并20个插入缓冲(总是)
  • 跳回到主循环(总是)
  • 不断刷新100个页直到符合条件(可能,跳转到flush loop中完成)

相关文章

网友评论

      本文标题:InnoDB 1.0.x版本之前的Master Thread

      本文链接:https://www.haomeiwen.com/subject/urvipxtx.html