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中完成)
网友评论