《InnoDB引擎》 Master ThreadIO ThreadPurge Thread

Posted DATA数据猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《InnoDB引擎》 Master ThreadIO ThreadPurge Thread相关的知识,希望对你有一定的参考价值。

后台线程


  后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行的状态。

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

1.Master Thread

  核心的后台线程,负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性,包括脏页的属性、合并插入缓冲、UNDO页的回收

2.IO Thread

  在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,极大提高数据库性能。而IO Thread住哟处理这些IO请求的回调处理。

  InnoDB 1.0之前有4个IO Thread,分别是write,read,insert buffer,log IO thread。Linux平台下,IO Thread的数量不能进行调整,但是在Windows平台下可以通过innodb_file_io_threas参数来增加IO Thread。

  InnoDB 1.0.x版本开始,read thread和write thread分别增大到4个,并且不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threadsinnodb_write_io_threads参数进行设置。

# 查看read thread和write thread的数量
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\\G可以查看InnoDB中的IO Thread:

mysql> show engine innodb status\\G;
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
......
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
.......

  从查询结果可以看出,thread 0是insert buffer thread,thread 1是log thread,thread2-5是read thread,thread 6-9是write thread。

3.Purge Thread

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

# my.cnf文件中
[mysqld]
innodb_purge_threads=1

  InnoDB 1.2版本之后,为了加快undo页的回收,进一步利用磁盘的随机读写性能,InnoDB开始支持多个Purge Thread:

mysql> show variables like 'innodb_purge_threads'\\G;
*************************** 1. row ***************************
Variable_name: innodb_purge_threads
        Value: 4
1 row in set (0.05 sec)

以上是关于《InnoDB引擎》 Master ThreadIO ThreadPurge Thread的主要内容,如果未能解决你的问题,请参考以下文章

InnoDB体系架构Master Thread工作方式

《InnoDB引擎》 MySQL配置文件及数据路径

MySQL——索引视图事务,存储引擎MyLSAM和InnoDB(实战篇!)

Linux系统中的mariadb主从数据库搭建

MySQL innodb引擎深入讲解

innodb存储引擎的数据文件放在哪里?