《InnoDB引擎六》InnoDB 1.0.x版本之前的Master Thread

news2024/11/30 4:57:12

在这里插入图片描述

Master Thread 工作方式

  在后台线程中提到,Master Thread是核心的后台线程。InnoDB存储引擎的主要工作都是在一个单独线程中完成的。

InnoDB 1.0.x版本之前的Master Thread

  Master Thread具有最高的线程优先级别。内部由多个循环组成:主循环(loop)、后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop)。Master Thread会根据数据库运行的状态在这四个循环中进行切换。

  Loop被称为主循环,因为大多数的操作都在主循环里,其中有两大部分的操作-即每秒钟的操作和每10秒的操作。伪代码如下:

void master_thread(){
    loop;
    for(int i = 0; i < 10 ; i++){
        do thing once per second
        sleep 1 second if necessary
    }
    do things once per ten seconds
    goto loop;
}

  如伪代码所示,loop循环是通过thread sleep实现的,这意味着其中的每秒一次或每10秒一次是不精准的。当负载很大的时候可能会有延迟。然后,InnoDB源代码中通过其他方法尽量保证整个频率。

每秒一次的操作包括:

  • 日志缓存刷新到磁盘,即使事务还没提交;(总是)

      即使某个事物还没有提交,InnoDB存储引擎仍然每秒将重做日志缓冲中的内容刷新到重做日志文件。这一点是是必须要知道的,因为这可以很好的解释为什么再大的事物提交时间也是很短的。

  • 合并插入缓冲;(可能)

      合并插入缓冲并不是每秒都会发生的。InnoDB存储引擎会判断当前一秒发生的IO次数是否小于5次,如果小于5次,InnoDB认为当前的IO压力很小,可以执行合并插入缓冲的操作。

  • 至多刷新100个InnoDB的缓冲池中脏页到磁盘;(可能)

      刷新100搁脏页也不是每秒都会发生的。InnoDB存储引擎通过判断当前缓冲池中脏页的比例buf_get_modified_ratio_pct是否超过了配置文件中innodb_max_dirty_pages_pct这个参数(默认90,代表90%),如果超过了这个阈值,InnoDB存储引擎认为需要做磁盘同步的操作,将100个脏页写入磁盘中。

  • 如果当前没有用户获得,则切换到backgroup loop;(可能)

void master_thread(){
    goto loop;
    loop;
    for(int i=0;i<10;i++){
        thread_sleep(1)
        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 > inodb_max_dirty_pages_pct)
            do buffer pool flush 100 dirty page
        if(no user activity)
            goto backgroup loop
    }
    do things once per ten seconds
    backgroup loop:
    	do something
        goto loop;
}

每十秒一次的操作包括:

  • 刷新100个脏页到磁盘(可能情况)
  • 合并至多5个插入缓冲(总是)
  • 将日志缓冲刷新到磁盘(总是)
  • 删除无用的Undo页(总是)
  • 刷新100个或者10个脏页到磁盘(总是)

  InnoDB存储引擎先判断过去10秒之内的磁盘的IO操作是否小于200次,如果是,InnoDB存储引擎认为当前有足够的磁盘IO操作能力,因此将100个脏页刷新到磁盘。

  接着InnoDB存储引擎会合并插入缓冲。不同于每秒一次操作时可能发生的合并插入缓冲操作,这次的合并插入缓冲操作总会在这个阶段进行。之后,InnoDB存储引擎会再进行一次将日志缓冲刷新到磁盘的操作。这和每秒一次时发生的操作是一样的。

  接着InnoDB存储引擎会进行下一步full purge操作,删除无用的undo页。对表进行update、delete这类操作时,原先的行被标记为删除,但是因为一致性读的关系,需要保留这些行版本的信息,但是在full purge过程中,InnoDB存储引擎会判断当前事务系统中已被删除的行是否可以删除,比如有时候可能还有查询操作需要读取之前版本的undo信息,如果可以删除,InnoDB会立即将其删除。从源代码中可以发现,InnoDB存储引擎在执行full purge操作时,每次最多尝试回收20个undo页。

  然后,InnoDB存储引擎会判断缓冲池中脏页的比例(buf_get_modified_ratio_pct),如果有超过70%的脏页,则刷新100个脏页到磁盘,如果脏页的比例小于70%,则只需要刷新10%的脏页到磁盘。

  主循环伪代码如下:

void master_thread(){
    goto loop;
    loop;
    for(int i=0;i<10;i++){
        thread_sleep(1)
        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 > inodb_max_dirty_pages_pct)
            do buffer pool flush 100 dirty page
        if(no user activity)
            goto backgroup loop
    }
    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 pull purge
    if(buf_get_modified_ratio_pct > 70%)
        do buffer pool flush 100 dirty page
    else 
        buffer pool flush 10 dirty page
    goto loop
    backgroup loop:
    	do something
    goto loop;
}

  然后再看一下background loop,若当前没有用户活动(数据库空闲时)或者数据库关闭(shutdown),就会切换到这个循环。backgroup loop会执行以下操作:

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

  若flush loop中也没有什么事情可以做了,InnoDB存储引擎会切换到suspend_loop,将Master Thread挂起,等待事件的发生。若用户启用了InnoDB引擎,却没有使用任何InnoDB存储引擎的表,那么Master Thread总是处于挂起状态。

  最后,Master Thread完整的伪代码如下:

void master_thread(){
    goto loop;
    loop;
    for(int i=0;i<10;i++){
        thread_sleep(1)
        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 > inodb_max_dirty_pages_pct)
            do buffer pool flush 100 dirty page
        if(no user activity)
            goto backgroup loop
    }
    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 pull purge
    if(buf_get_modified_ratio_pct > 70%)
        do buffer pool flush 100 dirty page
    else 
        buffer pool flush 10 dirty page
    goto loop
    backgroup loop:
    	do full purge
        do mere 20 insert buffer
    if not idle:
    	do merge 20 insert buffer
        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)
        goto flush loop
    goto suspend loop
        suspend loop;
    	suspend_thread();
    	waiting event;
    goto loop;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]SSM计算机毕业设计医院仪器设备管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于萤火虫算法优化的BP神经网络预测模型(Matlab代码实现)

目录 1 概述 2 萤火虫算法 3 萤火虫算法优化BP神经网络的算法设计 3.1 基本思想 3.2 萤火虫算法优化BP神经网络算法 4 运行结果 5 参考文献 6 Matlab代码及文章 1 概述 现实的世界中混沌现象无处不在,大至宇宙,小到基本粒子,都受到混沌理论支配.如气候变化会出 现混沌…

(三)DepthAI-python相关接口:OAK Nodes

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

[MySQL]-压力测试_TPCC-MySQL

[MySQL]-压力测试_TPCC-MySQL 森格 | 2022年10月 对数据库学习来说&#xff0c;压力测试也是十分必要的一环&#xff0c;本文章主要介绍了TPCC-MySQL这个工具的使用。 一、基本概念 1.1 基准测试VS压力测试 基准测试&#xff1a; 直接简单、易于比较&#xff0c;用于评估服务…

CAD必练图形

这次我们用CAD梦想画图软件绘制一个CAD新手必练图形&#xff0c;它用到的有CAD矩形、直线、圆弧、等分等命令结合起来完成绘制的&#xff0c;可以跟着一起操作一下。 目标图形 操作步骤 1.使用CAD矩形命令&#xff08;快捷键&#xff1a;REC&#xff09;绘制一个长80宽30的矩…

为什么macbook不能删除u盘里东西?苹果电脑如何删除u盘文件

为什么macbook不能删除u盘里东西&#xff1f;有时候&#xff0c;我们会发现U盘不能够在Mac上正常使用&#xff0c;只能够读取U盘上的文件数据&#xff0c;但是若想要对其进行删除或者是编辑操作&#xff0c;完全不能够实现&#xff0c;本文为大家详细介绍了不同情况的不同解决方…

云原生主题学习月|共同学习全球领先的亚马逊云科技云原生课程,组团共学拿奖励~

CSDN 已上线亚马逊云科技超过 60 门中文数字化培训课程&#xff0c;希望为学习者提供亚马逊云科技基础技能知识和最佳实践。 每门课程时长从十分钟到几小时不等&#xff0c;由亚马逊云科技专家打造&#xff0c;其中包括最受欢迎的《亚马逊云科技云从业者必修知识》&#xff0c…

vue3发送验证码倒计时 (防止连点、封装复用)

一、实现思路 倒计时 流程图二、实现一个简单的验证码倒计时 //倒计时初始变量 const codeNum ref(60); // 定时器id let clearId: number; // 发送验证码 const sendCode async () > { // 防止下次点击 如果倒计时的时间不是60 就不执行下面逻辑if (codeNum.value ! 60)…

AcWing算法学习第三节---高精度问题.

系列文章目录 第一节快速排序 第二节二分法 学习路上的风景&#xff0c;我陪你一起去看&#xff0c;编程路上的算法&#xff0c;我陪你一起去学&#xff0c;朋友们你们好&#xff0c;我是夏目浅石&#xff0c;蟹蟹你点开文章和我一同进步&#xff0c;加油&#xff01;遇见更好…

2022Q3手机配件增长榜:手机壳、数据线等供求不断增加

本篇我们将继续来分析22年Q3季度中手机通讯行业的高增长概念。在手机通讯行业中&#xff0c;我们发现了3个高增长品类&#xff0c;分别是&#xff1a;手机耳机、手机壳、数据线。 一、手机配件类高增长概念——手机耳机 手机耳机可以分为不同种类&#xff0c;如&#xff1a;开放…

现代物流有哪些特点?

现代物流的特点有系统化、网络化、信息化、专用化和准时性和柔性化。 现代物流特点一&#xff1a;系统化 现代物流强调了物流体系是一个具有综合性和系统性的过程&#xff0c;以优化物流管理体系为目标&#xff0c;降低物流运营管理成本&#xff0c;实现企业效益提升&#xff0…

python笔记76-types.FunctionType 动态创建函数

前言 types.FunctionType 创建函数有2种方式&#xff1a; 从已有函数的基础上&#xff0c;创建一个新函数从一个compile 构建的函数对象上&#xff0c;创建一个新函数 FunctionType 使用 FunctionType 可以用于判断一个对象是不是函数 from types import FunctionType, Me…

中国互联网综合实力100强:猿辅导第39

11月2日&#xff0c;中国互联网企业综合实力指数发布会暨百家企业高峰论坛在厦门成功举办。发布会上&#xff0c;中国互联网协会正式发布了《中国互联网企业综合实力指数&#xff08;2022&#xff09;》以及2022年中国互联网综合实力前百家企业榜单。 北京猿力教育科技有限公司…

腾讯基础面

传送门1. 有了解过C吗&#xff1f;接受转语言吗&#xff1f;2. 有没有了解过一些框架的底层原理、底层优化、数据库的索引优化3. 了解过哪些Map&#xff0c;可以从底层简单说下嘛&#xff1f;4. 你项目中是如何去实现幂等性的&#xff1f;5. RPC的协议讲一讲&#xff0c;怎么处…

开源共建 | TIS整合数据同步工具ChunJun,携手完善开源生态

TIS整合ChunJun实操 B站视频&#xff1a; https://www.bilibili.com/video/BV1QM411z7w5/?spm_id_from333.999.0.0 一、ChunJun 概述 ChunJun是一款易用、稳定、高效的批流统一的数据集成框架&#xff0c;可基于实时计算引擎Flink实现多种异构数据源之间的数据同步与计算&…

MySQL日志管理、备份与恢复

文章目录一、mysql常用日志1、概述①、错误日志②、二进制日志③、中继日志④、慢查询日志⑤、通用查询日志&#xff0c;用来记录MySQL的所有连接和语句&#xff0c;默认是关闭的2、数据库中查询日志状态①、查看二进制日志开启状态②、查看慢查询日志功能是否开启③、查看慢查…

FPGA书籍

1、Xilinx FPGA 权威设计指南 本书系统地介绍了Xilinx新一代集成开发环境Vivado 2018的设计方法、设计流程和具体实现。 全书共11章&#xff0c;内容包括Xilinx新一代UltraScale结构、Vivado集成设计环境导论、Vivado工程模式基本设计实现、Vivado非工程模式基本设计实现、创建…

Java-1129

Java8 新特性 速度更快代码更少&#xff08;lambda、stream&#xff09;强大的Stream API便于并行最大化减少空指针异常Optional 速度更快&#xff1a;对底层数据结构哈希map的优化 解释说明hashmap基本原理 hashmap本质是一个长度16的数组元素的键值对以key&#xff1a;valu…

强化学习实战——Motion Imitation环境配置+所遇问题(win10)

GitHub代码 注意&#xff1a;本篇环境配置是基于上一篇强化学习实战——OpenAI Gym环境配置实战演示&#xff08;win10&#xff09;环境的延续&#xff01;&#xff01;&#xff01; 一、环境配置 1&#xff09;下载requirements.txt内安装包 问题1&#xff1a;pybullet不能…

天图资本通过香港上市聆讯:上半年利润下滑24%,王永华为董事长

11月29日&#xff0c;深圳市天图投资管理股份有限公司&#xff08;下称“天图投资”&#xff09;通过港交所聆讯并在港交所递交了聆讯后资料集&#xff08;即招股书&#xff09;。相较于此前招股书&#xff0c;天图资本补充了截至2022年6月30日的财务数据等信息。 招股书显示&a…