引用链接:http://www.cnblogs.com/henglxm/p/4284504.html

 

1.IO THREAD: 负责IO的相关线程IO THREAD

1. 参数innodb_write_io_threads  写线程 默认四个,负责数据块的写入

2. 参数innodb_read_io_threads 读线程  默认四个,负责数据块的读取

上面两个参数高并发下,可以设置为8.

show variables like '%write_io%'

show variables like '%read_io%'

也可通过mysql> show engine innodb status\G;查看IO thread.

2.Purge thread

作用: 真正的删除记录和删除undo log

1.清理删除后的数据页的空间(因为之前的删除只是打上删除标签,并没有正真删除),

2.清理undo

举例:表tb1中有记录pk=1,2,3;

此时delete from tb1 where pk=1;

1. 将pk=1的记录标记为删除(delete-mark,infobits),数据库中pk=1的记录此时还是存在的,空间并没有被释放,该操作为同步操作(SQL执行完,也就标记完成了)。

2. purge ,该部分为后台线程(purge线程)异步操作,会真正的删除该记录,且空间被释放。

标记为已删除的原因:

1. 该事物可能需要回滚,先作保留。

2. 当事物1去删除pk=1且没有提交时, 事物2应该要能看到pk=1的记录(事物的隔离性)。

过滤条件是聚簇索引:

1. delete – 将该记录标记为 delete-mark 。

2. update – 将该记录 先物理delete (聚簇索引里主键相同的行最多只能有1个),然后 insert (或者可以原地更新[in place update])(即使删除了,也可以通过undo进行还原)。

过滤条件是二级索引:

1. delete – 将该记录标记为 delete-mark 。

2. update – 将该记录标记为 delete-mark (索引列是columns + pk,即使是唯一索引更新也是和原来的不一样),然后 insert 。

为什么没有insert?

1. insert操作是不需要异步去purge,因为insert的记录之前是不存在的;

2.不存在记录(未提交)是没有别的事物能引用到的,所以insert以后,对应的undo可以直接删除,而不需要等待异步.

purge 总结:

1. delete-mark的记录最后会被purge线程回收,Purge会检测记录上是否有其他事物在引用undo,如果没有就可以删除。

2. innodb_purge_threads (5.6以后),可以设置的大一些,回收的速度会快一些。

innodb_purge_threads = 4

 

3.Insert-buffer thread

 负责insert buffer与辅助索引的合并操作。

 

4.redo-log thread

 负责重做日志缓冲的磁盘写入

 

5.Master thread(主线程)

master thread的线程优先级别最高。
后台进程Master thread 里面有两种循环,再循环内可以调用其他线程进行相关的操作。

其内部几个循环(loop)组成:主循环(loop),后台循环(background loop),刷新循环(flush loop),暂停循环(suspend loop)。主循环有1s循环和10s循环. 1s循环即循环执行一次就sleep 1s后又执行一次又sleep 1 s.

每秒一次的操作包括 :

1.日志缓冲刷新到磁盘, 即使事务没有提交(commit).

注意! 即使事务没有提交操作, innodb 重做日志缓存仍然会刷新到重做日志文件, 所以就算很大的事务操作的commit没有想象中那么慢.

2.合并插入缓冲(可能),合并插入缓冲不一定每秒都执行, innodb引擎会判断当前1秒内发生的IO次数是否小于5次, 如果小于5次.则合并插入缓冲.

3. 最多刷新100个 innodb缓冲池中的脏页到磁盘(可能),innodb存储引擎通过判断当前缓冲池中脏页的比例()是否超过配置文件中innodb_max_dirty_pages_pct这个参数的值.如果超过了这个阀值 ,innodb存储引擎则认为需要做磁盘同步操作,刷新100个脏页到磁盘.

4. 如果当前用户没有活动, 切换到 background thread (可能)

每10秒执行的操作 :

1 .刷新100个脏页到磁盘 (总是)

2. 合并最多5个插入缓冲(总是)

3. 将日志缓冲刷新到磁盘(总是)

4. 删除无用的Undo页(总是)

5. 刷新100个或者10个脏页到磁盘(总是)

在10秒的循环操作中. innodb存储引擎首先判断过去10秒内的磁盘IO操作是否小于200次, 如果小于,则将100个脏页刷新到磁盘.  然后合并 (最多5个)插入缓冲, 然后将重做日志缓冲刷新到日志文件.然后,innodb存储引擎会执行一次full purge. 既删除无用的undo页. 对表(磁盘)进行update, 和delete这类操作时,原先被标记为删除,但是因为一致性读(consistent read)的关系, 需要保留这些行版本的信息. 但是在full purge 过程中, innodb存储引擎会判断当前事务中已被删除的行是否可以在表(磁盘)中删除,如果可以,则立刻删除.  innodb在执行full purge操作时,每次最多尝试回收20个undo page. 最后innodb存储引擎会判断缓冲池中脏页的比例,  如果超过70%, 则刷新100个脏页到磁盘, 如果脏页比例小于70%,则是刷新10%的脏页到磁盘。

background loop :若当前没有用户活动或者数据库关闭(shutdown)时,就会切换到这个循环. background loop 会执行以下操作.

1 .删除无用的 undo 页(总是)

2. 合并20个插入缓冲页(总是)

3. 跳回到主循环(总是)

4. 不断刷新到100个脏页直到符合条件(可能, 跳转到flush loop 中完成)

若flush loop 中也没有什么事情可以做了, innodb存储引擎会切换到suspend_loop. 将master_thread挂起, 等待事件发生.若用在mysql中启用了innodb存储引擎,但没有创建innodb表, 则master thread总是处于挂起状态。

查看后台线程:

mysql> Show engine innodb status\G;

srv_master_thread loops: 56 1_second, 56 sleeps, 5 10_second, 6 background, 6 flush

srv_master_thread log flush and writes: 56

其中 srv_master_thread loops: 56 表示主循环进行了,56次. 56 sleeps 表示挂起56次, 5 10_second 表示10秒的循环执行了5次. background loop执行6次, flush loop执行6 次。如果 srv_master_thread loops 与sleeps 存在较大差距,则表明当前服务器可能很比较繁忙 , 因为innodb在其内部进行了优化, 在压力大的情况下,1秒循环并不是每次都sleep 。

 

6. IO有关参数

 innodb_io_capacity(落脏个数) . innodb_write_io_threads(写IO) .innodb_read_io_threads(读IO)     innodb_page_cleaners(刷脏频次)


  1. 落盘脏页个数参数(
innodb_io_capacity)

参数 :innodb_io_capacity :数据库落盘脏页个数 ,配置压力和磁盘的性能相关,如果过大,IO能力不足,则出现卡顿。

innodb_io_capacity默认是200,单位是页,该参数的设置大小取决于硬盘的IOPS,即每秒的输入输出量(或读写次数)。

可以动态调整参数:set global innodb_io_capacity=2000;

查看 innodb_io_capacity值: show variables like '%innodb_io_cap%';

配置建议如下:

innodb_io_capacity           磁盘配置

200                    单盘SAS/SATA

2000                    SAS*12  RAID10

5000                    SSD

20000                   FUSION-IO

建议:尽量不要超过20000.

   2. IO读写参数(innodb_write_io_threads,innodb_read_io_threads

参数innodb_write_io_threads和innodb_read_io_threads 分别负责数据块的写入和读取,默认是4,高并发可设置为8.
       
      3.刷新lru list 和flush list的参数(innodb_page_cleaners
 在MySQL5.6中,开启了一个独立的page cleaner线程来进刷lru list 和flush list。默认每秒运次1次.MySQL5.7 可设置多个page cleaner线程提高脏页刷新效率 ;

1、5.6版本以前,脏页的清理工作交由master线程的;

2、Page cleaner thread是5.6.2引入的一个新线程(单线程),从master线程中卸下buffer pool刷脏页的工作独立出来的线程(默认是启一个线程);

3、5.7开始支持多线程刷脏页;

show global status like '%Innodb_buffer_pool_wait_free%';

如果值很大,则需要增加innodb_page_cleaners值,同时增加写线程。

 

innodb之线程及IO相关参数介绍的更多相关文章

  1. Innodb Read IO 相关参数源代码解析

    前言:最近在阅读Innodb IO相关部分的源代码.在阅读之前一直有个疑问,show global status 中有两个指标innodb_data_reads 和 innodb_data_read. ...

  2. slow-log 和bin-log相关参数介绍

    1. slow-log show global status Slow_queries   --------慢查询的次数,即查询的时间超过long_query_time设置的时间(不能修改) 配置文件 ...

  3. property相关参数介绍

    1.copy 使用类型 :NSString,block 2.assign使用类型 :delegate,int,float,NSInteger,bool,枚举,结构体... 3.retain使用类型 : ...

  4. 超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数

    超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数 介绍galera cluster原理的文章已经有一大堆了,百度几篇看一看就能有相关了解,这里就不赘述了.本文主 ...

  5. Data Guard相关参数学习介绍

    LOG_ARCHIVE_DEST_n 参数属性介绍 该参数的n在11g中为1到31,下列为参数的属性值: u  AFFIRM and NOAFFIRM u  ALTERNATE (not suppor ...

  6. MySQL相关参数总结

    保留个原文链接,避免被爬虫爬了过去,以便后续更正补充:https://www.cnblogs.com/wy123/p/11273023.html MySQL参数繁多,是一个需要根据具体业务.软硬件环境 ...

  7. Mysql Innodb 引擎优化-内存、日志、IO、其他相关参数

    介绍: InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色增加 ...

  8. 14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率:

    14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率: 主线程 在InnoDB 是一个线程 执行各种任务在后台. ...

  9. linux IO 内核参数调优 之 原理和参数介绍

    1.  page cache linux操作系统默认情况下写都是有写缓存的,可以使用direct IO方式绕过操作系统的写缓存.当你写一串数据时,系统会开辟一块内存区域缓存这些数据,这块区域就是我们常 ...

随机推荐

  1. 【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

    俄罗斯方块的核心玩法非常简单,所以制作起来并不是很复杂,我准备先用2篇文字的篇幅详细讲解一下俄罗斯方块的制作方法. 今天咱们算是第一篇,主要讲解俄罗斯方块中如何定义方块,以及如何实现方块的移动.旋转. ...

  2. goland 注册

    注意:本教程已过期  请使用其他人教程激活最新版   https://www.789zhao.com/blog/JC08EIFBS9TM.html https://shimo.im/docs/dKYC ...

  3. ffmpeg实现视频的翻转与旋转(ffmpeg4.2.2)

    一,ffmpeg的安装 请参见: https://www.cnblogs.com/architectforest/p/12807683.html 说明:刘宏缔的架构森林是一个专注架构的博客,地址:ht ...

  4. Python常用模块之random和time

    常用模块: time: 分为三种格式: 1.时间戳:从1970年1月1日0点0分0秒到现在经过的秒数 用于时间间隔的计算 import time print(time.time()) 2.字符串显示时 ...

  5. 监听MySQL的binlog日志工具分析:Canal

    Canal是阿里巴巴旗下的一款开源项目,利用Java开发.主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费,目前主要支持MySQL. GitHub地址:https://github. ...

  6. 《Connecting the Dots: A Knowledgeable Path Generator for Commonsense Question Answering》一文的理解和总结

    构建常识问答知识路径生成器 论文贡献 ​ 提出学习一个多跳知识路径产生器来根据问题动态产生结构化证据.生成器以预先训练的语言模型为主干,利用语言模型中存储的大量非结构化知识来补充知识库的不完整性.路径 ...

  7. js 日期格式、内容合法、比较大小、表单提交验证

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"/> 5 &l ...

  8. Lombda表达式(五)

    public class Test05 { /* * lambda表达式是用来简化匿名内部类的一种函数式编程的语法. * 只有SAM接口才能使用lambda表达式 * 方法引用和构造器引用是用来简化l ...

  9. JUC---00创建线程的方式

    一.继承Thread类 1 package com.jenne.mydemo; 2 3 public class TestMyThread { 4 public static void main(St ...

  10. Spring 最常用的 7 大类注解,哪些你还不知道?

    随着技术的更新迭代,Java5.0开始支持注解.而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架. 而spring的的注解那 ...