这篇文章主要讲解了“MySQL中Innodb page clean线程分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中Innodb page clean线程分析”吧!page_cleaner_t:整个Innodb只有一个,包含整个page clean线程相关信息。其中包含了一个page_cleaner_slot_t的指针。page_cleaner_slot_t:每个buffer instance都包含一个这样的结构体,page clean工作线程刷新的时候每个线程都会轮询的检测每个槽,知道找到没有被其他page clean线程刷新的槽进行刷新工作,直到每个槽(buffer instance )都刷新完成。参考pc_flush_slot函数。协调工作线程入口:buf_flush_page_cleaner_coordinator工作线程入口:buf_flush_page_cleaner_worker其由函数buf_flush_page_cleaner_coordinator实现。实际正常运行情况下的工作都包含在while (srv_shutdown_state == SRV_SHUTDOWN_NONE) 这个大循环下。首先如果没有活跃的change buffer 并且没有pending的物理块,并且上次刷新的块数量为0
则不需要睡眠1秒:但是这个睡眠是可以被唤醒的,比如同步刷新应该就会唤醒它(buf_flush_request_force函数)。参考函数os_event::wait_time_low如前文所描述这里产生如下警告:源码片段:触发条件同步会唤醒正在睡眠状态的page clean协调工作线程那么睡眠应该不会满足一秒的条件所以不会被标记为OS_SYNC_TIME_EXCEEDED,同时srv_flush_sync和buf_flush_sync_lsn均会被设置接下来就是唤醒工作线程进行刷新,同时本协调线程也完成部分任务。工作代码唤醒操作如前文描述在checkpoint或者DML语句执行过程中都会通过log_free_check检查是否redo log处于安全的状态,如果不安全就会调用如下代码(log_preflush_pool_modified_pages函数中)唤醒page clean线程进行同步刷新:触发条件这里判断是否有活跃的线程,所谓活跃就是调用srv_i免费主机域名nc_activity_count函数进行增加的,一般来讲DML和DDL会标记为活跃,purge线程及其工作线程工作期间会标记为活跃。可以将断点做到srv_inc_activity_count进行debug。所以线上数据库DML比较多所以一般都会是活跃刷新。工作代码这里涉及到刷新多少个块计算主要函数为 page_cleaner_flush_pages_recommendation,后面在讨论。触发条件当睡足了1秒,并且没有活跃的线程。那么就进行空闲刷新,一般来讲如果没有DML/DDL等语句那么应该进行是空闲刷新。工作代码可以看到这里的百分比直接是100%及按照innodb_io_capacity参数的设定进行刷新。当然这里只是看了正常期间工作的代码,如果是Innodb shutdown也会触发同步刷新。可自行参考代码。前面提过这个函数,是活跃刷新刷新块的计算函数,下免费主机域名面直接给出整个代码此函数最后计算出了需要刷新的块,其中刷新比率计算的的重点函数为af_get_pct_for_dirty和af_get_pct_for_lsn 下面将给出代码注释,其实前文中的算法就来自af_get_pct_for_dirty。af_get_pct_for_dirty函数af_get_pct_for_lsn函数:注意innodb_cleaner_lsn_age_factor参数默认设置为high_checkpoint,可以看到算法最后是除以700.5,所有前文我说这个函数算出来的比率一般比较小。感谢各位的阅读,以上就是“MySQL中Innodb page clean线程分析”的内容了,经过本文的学习后,相信大家对MySQL中Innodb page clean线程分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!
相关推荐: oracle中如何解决ORA-01940无法删除当前已连接用户问题
这篇文章主要介绍了oracle中如何解决ORA-01940无法删除当前已连接用户问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在进行测试环境导数据的时候,需要记性drop user操作。在执…