innodb之线程及IO相关参数介绍

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

 

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

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

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

上面两个参数高并发下,能够设置为8.sql

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=123;高并发

此时delete from tb1 where pk=1;

1. pk=1的记录标记为删除(delete-markinfobits),数据库中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操做时,每次最多尝试回收20undo 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线程提升脏页刷新效率 ;

15.6版本之前,脏页的清理工做交由master线程的;

2Page cleaner thread5.6.2引入的一个新线程(单线程),从master线程中卸下buffer pool刷脏页的工做独立出来的线程(默认是启一个线程)

35.7开始支持多线程刷脏页;

show global status like '%Innodb_buffer_pool_wait_free%';

若是值很大,则须要增长innodb_page_cleaners值,同时增长写线程。

相关文章
相关标签/搜索