[MySQL 5.6] Innodb后台线程之master线程

发布时间:2021-10-29 00:50:04

在MySQL 5.6中,master线程的工作已经被大大减轻,类似purge, page clean都分配给独立的后台线程来进行。那么现在master线程还需要干啥活儿呢。以下就是本文需要介绍的部分





简单的看看代码,函数入口不变,依旧是srv_master_thread,但相对5.5的代码,这里已经非常非常精简了。



概括的说,master线程干这么几件事儿:




A. 每sleep 1秒钟



检查最*1秒内是否有活跃事件,这是一个全局计数器,在几个地方会被递增(通过函数srv_inc_activity_count):


1.srv_active_wake_master_thread?> 实际上在5.6里这里只剩下计数器的功能了,因为除非是以force recovery 启动,或者被shutdown了,否则不会进入suspend状态


2.srv_wake_master_thread?> 在DROP/TRUNCATE TABLE时会调用到,实际上 ,在5.6的代码里,master线程大多是在sleep的状态,并不需要去做wake up的动作(report了一个bug:http://bugs.mysql.com/bug.php?id=69270)


3.row_undo_step->事务回滚时



例如事务提交/prepare时(innobase_commit->srv_active_wake_master_thread) ,事务回滚时,一个简单的查询都会引起计数器增加,从而让Master线程判定现在系统正忙.




A.1如果认定现在系统正忙,则调用函数srv_master_do_active_tasks,做如下工作:



1.log_free_check







总会检查redo中是否有足够的空间,以确定是否做flush或者做checkpoint,通常情况下,用户线程在写redo日志之前也会无条件调用该函数。






这里会先在无加锁的情况下,检查log_sys->check_flush_or_checkpoint是否为TRUE,如果为TRUE,则调用log_check_margins(),否则直接返回。







check_flush_or_checkpoint在函数log_close中被设置,backtrace如下:






? ? ??mtr_commit->mtr_log_reserve_and_write->log_close()







在每次将一个mtr日志写到buffer后,总会调用log_close()函数,注意,该函数是持有log_sys->mutex锁的







有以下几种情况会去设置check_flush_or_checkpoint为TRUE:








    • log_sys->buf_free > log_sys->max_buf_free
    • log_sys->lsn-buf_pool_get_oldest_modification() >log_sys->max_modified_age_sync
    • log_sys->lsn-log_sys->last_checkpoint_lsn >?log_sys->max_checkpoint_age_async








      TODO: mtr的组织,如何提交,以及redo 日志在内存中的控制







      log_free_check会调用log_check_margins做两件事:






      1)调用log_flush_margin:首先确认log->buf_free 是否大于 log->max_buf_free,如果是,则需要将日志写到文件,到当前lsn(log_write_up_to(lsn, LOG_NO_WAIT, FALSE))。如果已经有别的线程在干这活儿,则啥也不干,返回






      2)调用log_checkpoint_margin,判断是否达到redo的同步刷脏点,或者异步/同步checkpoint点,决定是否刷脏(log_preflush_pool_modified_pages)及做checkpoint(log_checkpoint)






      3)如果log_sys->check_flush_or_checkpoint依然为TRUE,则回到1)继续。












      做ibuf merge, 正常情况下,每次处理innodb_io_capacity*0.05个page,






      但如果ibuf->size > ibuf->max_size / 2,则处理:






      n_pages =?innodb_io_capacity ? * ? {?[((ibuf->size ? ibuf->max_size / 2)*100)/(ibuf->max_size + 1)]/100 }






      这种情况说明change buffer太多了,需要合并更多的page








      3.srv_sync_log_buffer_in_background();







      如果需要的话,sync日志到磁盘






      master线程通过该函数确保每隔一段时间,刷一次redo日志到磁盘log_buffer_sync_in_background(TRUE)->log_write_up_to(log_sys->lsn, LOG_NO_WAIT, TRUE)






      时间间隔由innodb_flush_log_at_timeout来控制,单位为秒。






      根据文档的解释,innodb_flush_log_at_timeout只有在innodb_flush_log_at_trx_commit值为2时才生效,但事实上,不管inndob_flush_log_at_trx_commit设为何值,都会调用log_buffer_sync_in_background







      TODO:需要检查,如果innodb_flush_log_at_trx_commit设为1时,是否还需要调用srv_sync_log_buffer_in_background()函数









      4.如果打开了MEM_PERIODIC_CHECK宏(默认关闭),则每隔13秒,检查是否出现内存损坏(mem_validate_all_blocks)



      5.每隔47秒(SRV_MASTER_DICT_LRU_INTERVAL)检查一次dict cache。








      srv_master_evict_from_table_cache(50)






      需要持有dict_operation_lock的x锁,以及dict_sys->mutex






      dict_make_room_in_cache :最大允许的table cache大小由table_definition_cache来决定






      > 如果当前dict_sys->table_LRU的长度尚小于table_definition_cache,无需检测,直接返回






      >否则,从table_LRU尾部开始,对于可以驱逐的表(dict_table_remove_from_cache_low),从dict cache中移除(dict_table_remove_from_cache_low),直到检测长度超过pct_check(这里是50%)或者dict cache长度<=table_definition_cache停止扫描







      满足如下条件的表可以被从dict cache中驱逐:






      1.当前没有被任何事务引用(table->n_ref_count = 0 )






      2.该表上没有表锁或和录锁(table->locks) == ?0 ?&& ?table->n_rec_locks == 0)






      3.表上的索引没有被adaptive hash index引用(index->search_info->ref_count 为0)







      这也是5.6的一点优化,主要是防止数据词典过大导致太大的内存消耗.如果内存对你而言不是问题,那就尽量调大table_definition_cache吧。









      6.每隔7秒(SRV_MASTER_CHECKPOINT_INTERVAL)做一次新的checkpoint


      log_checkpoint(TRUE, FALSE);?




      A.2如果认定现在系统正处于空闲,则调用函数srv_master_do_idle_tasks



      1.检查redo?log_free_check();


      2.做一次ibuf merge ?


      ibuf_contract_in_background(0, TRUE);


      3.检查dict cache ,srv_master_evict_from_table_cache(100);


      4.刷日志(srv_sync_log_buffer_in_background)


      5.做一次新的checkpoint .log_checkpoint



      idle 和 active的时候,所做的事情几乎是一样的,不同的是,在active状态下,每47秒才检查dict cache,每7秒才做一次check point?


      因此在idle状态下,master线程可能会更加繁忙




      B.在关闭实例时



      调用srv_master_do_shutdown_tasks


      1.log_free_check()


      2.ibuf_contract_in_background(0, TRUE)


      3.srv_sync_log_buffer_in_background()


      4.log_checkpoint(TRUE, FALSE);

      5. ? ? ? ? ? ? ? ?srv_shutdown_print_master_pending(



      ? ? ? ? ? ? ? ? ? ? ? ? last_print_time, n_tables_to_drop, n_bytes_merged);













      相关资源:JAVA*偈道绰胍约翱聪钅吭创

相关文档

  • 给集团的感谢信范推荐
  • 小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。 当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形
  • 2018年内蒙古东河区居民医保异地就医小知识:内蒙古包头市东河区
  • Android了解
  • 米家扫地机器人充满电需要多长时间_米家扫地机器人长期在充电状态对电池有影响吗...
  • 大智慧小故事电子书中的故事
  • Android的apk安装时签名相同冲突解决
  • 遵义市大学生创业扶持政策
  • 大年三十可以回娘家吗?大年三十不能回娘家吗?
  • 商业用房销售协议
  • 南京市企业工资集体合同
  • 快乐的五一假期作文小学
  • 关于母亲节的感谢信精选多篇
  • 2019-08-09 linux 安装expect
  • 秋季天凉易感冒 冷水洗脸来预防
  • 非体外循环冠状动脉搭桥术的麻醉和管理 动脉粥样硬化能治愈吗
  • 凶恶的面相的是怎样的
  • 利用python进行数据加载和存储
  • 排毒养颜汤的做法大全
  • 吃西餐该注意些什么
  • 爱国演讲-我的祖国
  • PN结讲解
  • 2017年参加拓展训练心得体会范文
  • 《史记故事》读后感400字
  • 2017年山东高考加分政策
  • 以太网的扩展
  • 心理健康教育方面的相关论文
  • 僵尸粉检测 php,微信新功能,一键检测你的手机卡不卡,还能查僵尸粉
  • 简历的自我评价范文大全
  • 什么是白苹果
  • 猜你喜欢

  • 普通中小学办学条件基本情况3
  • 今年前4个月我国鞋出口量增价扬
  • 湖南省益阳市2016-2017学年高一下学期3月月考试题 数学 Word版含答案
  • 夺金欲望成就冠军 细数大连网络推广行业谁有冠军相
  • 绍兴市越城区富盛镇青马村经济合作社企业信用报告-天眼查
  • 综合实践报告个人总结
  • 年产xxx混合型卷烟项目立项申请报告
  • 《新标准英语》教材分析第三册解析
  • 本钢修建福利厂企业信用报告-天眼查
  • 在初中田径体育教学中实施愉快教学的建议
  • 重庆市六校2012-2013学年高一政治上学期期末联考试题新人教版
  • 《幼儿园教育指导纲要(试行)》定位下的幼儿教师角色研究
  • Division of the stages of coalbed methane desorption based on the Langmuir adsorption isotherm
  • 小学语文课中作文教学存在的问题及对应的措施
  • 小学六年级状物作文:蜡烛_1
  • 2017年八年级语文教学工作总结
  • 实验小学教学大赛评比方案2016
  • 新苏教版数学五年级上册 小数的性质 教学课件1
  • 【11】2012年工作总结及2013年工作计划
  • 2014THE中国与爱尔兰综合大学排名对比
  • 2019-201X年禁毒工作安排会议记录-word范文模板 (1页)
  • 闺蜜生日贺词2020
  • 高考地理大二轮复*微专题七植被与地理环境的关系学案
  • 哲理内涵空间说说大全
  • 加强惩防体系建设的研究与思考
  • 水基灭火器可以灭电器火灾吗水基灭火器的优势介绍
  • 【测控指导】2015-2016学年高中生物 第四章 生物化学与分子生物学技术实践本章整合课件 苏教版选修1
  • 苏科版数学七年级下册江苏省兴化市楚水初级中学第二学期期中考试 .doc
  • 【推荐】2020年早安共勉句子朋友圈21条
  • 怎么把酷狗音乐备份到微云
  • 烟草综合办公室主任竞聘书
  • 关于东南大学九龙湖校区苏果超市顾客满意度
  • 健康教育在胆石症病人围术期中的应用
  • 云朵健身操第七套视频
  • Ubuntu caffe 搭建
  • 最新电站培训工作总结资料
  • 为父母洗脚
  • 房地产开发企业的销售定价决策
  • 我的启蒙老师_三年级作文_3
  • 兰州天伦不孕症医院员工劳动纪律评估考核表
  • 【中学学校】2017—2018学年度第一学期学校工作计划
  • 人教精通版英语四年级下册 Unit6 Would you like to take a trip?(Lesson36)课件
  • 电脑版