Mysql体系结构详解——后台线程(待更新)

本文只是一个初稿,还有很多不确定的地方。晚上在看看官方文档看看。

InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。

1.Master Thread

Master Thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER)、UNDO页的回收等。2.5节会详细地介绍各个版本中Master Thread的工作方式。

master thread的线程优先级别最高。其内部由几个循环(loop)组成:主循环(loop)、后台循环(backgroundloop)、刷新循环(flush loop)、暂停循环(suspend loop)。master thread会根据数据库运行的状态在loop、background loop、 flush loop和suspend loop中进行切换。loop称为主循环,因为大多数的操作都在这个循环中,其中有两大部分操作:每秒钟的操作和每10秒的操作.
Loop为主循环,如果没有用户活动,就切换到backgroundloop中,然后跳转会loop,如果还需要flush刷新,那就转到flush loop,如果在flush loop中也空闲,那就切换到suspend loop中,将master thread挂起等待事件的发生。

每秒一次的操作包括:

™ 日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)。

™ 合并插入缓冲(可能)。

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

™ 如果当前没有用户活动,切换到background loop(可能)。
接着来看每10秒的操作,包括如下内容:

™ 刷新100个脏页到磁盘(可能)。

™ 合并至多5个插入缓冲(总是)。

™ 将日志缓冲刷新到磁盘(总是)。

™ 删除无用的Undo页(总是)。

™ 刷新100个或者10%脏页到磁盘(总是)。

™ 产生一个检查点(总是)。

Background loop会执行以下操作

™ 删除无用的Undo页(总是)。

™ 合并20个插入缓冲(总是)。

™ 跳回到主循环(总是)。

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

2.IO Thread

在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。而IO Thread的工作主要是负责这些IO请求的回调(call back)处理。InnoDB 1.0版本之前共有4个IO Thread,分别是write、read、insert buffer和log IO thread。在Linux平台下,IO Thread的数量不能进行调整,但是在Windows平台下可以通过参数innodb_file_io_threads来增大IO Thread。从InnoDB 1.0.x版本开始,read thread和write thread分别增大到了4个,并且不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threads和innodb_write_io_threads参数进行设置,如:

mysql>SHOW VARIABLES LIKE 'innodb_version'\G;

*************************** 1. row ***************************

Variable_name: innodb_version

       Value: 1.0.6

1 row in set (0.00 sec)
mysql>SHOW VARIABLES LIKE 'innodb_%io_threads'\G;

*************************** 1. row ***************************

Variable_name: innodb_read_io_threads

       Value: 4

*************************** 2. row ***************************

Variable_name: innodb_write_io_threads

       Value: 4

2 rows in set (0.00 sec)

可以通过命令SHOW ENGINE INNODB STATUS来观察InnoDB中的IO Thread:

mysql>SHOW ENGINE INNODB STATUS\G;

*************************** 1. row ***************************

  Type: InnoDB

  Name:

Status:

=====================================

100719 21:55:26 INNODB MONITOR OUTPUT

=====================================

Per second averages calculated from the last 36 seconds

……

--------

FILE I/O

--------

I/O thread 0 state: waiting for i/o request (insert buffer thread)

I/O thread 1 state: waiting for i/o request (log thread)

I/O thread 2 state: waiting for i/o request (read thread)

I/O thread 3 state: waiting for i/o request (read thread)

I/O thread 4 state: waiting for i/o request (read thread)

I/O thread 5 state: waiting for i/o request (read thread)

I/O thread 6 state: waiting for i/o request (write thread)

I/O thread 7 state: waiting for i/o request (write thread)

I/O thread 8 state: waiting for i/o request (write thread)

I/O thread 9 state: waiting for i/o request (write thread)

……

----------------------------

END OF INNODB MONITOR OUTPUT

============================



1 row in set (0.01 sec)

可以看到IO Thread 0为insert buffer thread。IO Thread 1为log thread。之后就是根据参数innodb_read_io_threads及innodb_write_io_threads来设置的读写线程,并且读线程的ID总是小于写线程。

3.Purge Thread

事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页。在InnoDB 1.1版本之前,purge操作仅在InnoDB存储引擎的Master Thread中完成。而从InnoDB 1.1版本开始,purge操作可以独立到单独的线程中进行,以此来减轻Master Thread的工作,从而提高CPU的使用率以及提升存储引擎的性能。用户可以在MySQL数据库的配置文件中添加如下命令来启用独立的Purge Thread:

[mysqld]

innodb_purge_threads=1

在InnoDB 1.1版本中,即使将innodb_purge_threads设为大于1,InnoDB存储引擎启动时也会将其设为1,并在错误文件中出现如下类似的提示:

120529 22:54:16 [Warning] option 'innodb-purge-threads': unsigned value 4 adjusted to 1

从InnoDB 1.2版本开始,InnoDB支持多个Purge Thread,这样做的目的是为了进一步加快undo页的回收。同时由于Purge Thread需要离散地读取undo页,这样也能更进一步利用磁盘的随机读取性能。如用户可以设置4个Purge Thread:

mysql> SELECT VERSION()\G;

*************************** 1. row ***************************

VERSION(): 5.6.6

1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'innodb_purge_threads'\G;

*************************** 1. row ***************************

Variable_name: innodb_purge_threads

       Value: 4

1 row in set (0.00 sec)

4.Page Cleaner Thread

Page Cleaner Thread是在InnoDB 1.2.x版本中引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。而其目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。

5.锁监控线程

6.错误监控线程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值