欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

InnoDB存储引擎之MasterThread

程序员文章站 2024-02-07 15:26:40
...

InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成的。 1.InnoDB 1.0.x版本之前的Master Thread Master Thread具有最高的线程优先级别。其内部由多个循环组成:主循环(loop)、后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(s

InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成的。
1.InnoDB 1.0.x版本之前的Master Thread

Master Thread具有最高的线程优先级别。其内部由多个循环组成:主循环(loop)、后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop)。Master Thread会根据数据库运行的状态在上述4状态下进行切换。Loop被称为主循环,因为大多数的操作是在这个循环中,其中有两大部分的操作:每秒的操作和每10秒的操作。伪代码如下:

InnoDB存储引擎之MasterThread

可以看到,loop循环通过thread sleep来实现,这意味着所谓的每秒一次或者每10秒一次的操作是不精确的。在负载很高的情况可能会有延迟,只能说大概在这个频率下。当然InnoDB源代码中还通过其他的方法来尽量保证这个频率。
每秒一次的操作:
a.日志缓冲刷新到磁盘,即使这个事务还没有提交(总是);
即使某个是我还没有提交,InnoDB存储引擎仍然每秒会将重做日志缓冲中的内容刷新到重做日志文件。这就可以解释为什么再大的事务提交的时间也很短。
b.合并插入缓冲(可能);
合并插入缓冲(Insert Buffer)并不是每秒都会发生。InnoDB存储引擎会判断当前一秒内发生的IO次数是否小于5次,如果小于5次,InnoDB认为当前的IO压力很小,可以执行合并插入缓冲的操作。
c.至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能);
InnoDB存储引擎通过判断当前缓冲池中脏页的比例(buf_get_modified_ratio_pct)是否超过了配置文件中innodb_max_dirty_pages_pct这个参数的值,如果超过了这个阀值,InnoDB存储引擎认为需要做磁盘同步操作,将100个脏页写入磁盘。
d.如果当前没有用户活动,则切换到background loop(可能);
每10秒的操作:
a.刷新100个脏页到磁盘(可能);
b.合并至多5个插入缓冲(总是);
c.将日志缓冲刷新到磁盘(总是);
d.删除无用的Undo页(总是);
e.刷新100个或者10个脏页到磁盘(总是);
在以上的过程中,InnoDB存储引擎会先判断过去10秒内磁盘的IO操作是否小于200次,如果是,InnoDB存储引擎认为当前有足够的磁盘IO操作能力,因此将100个脏页刷新到磁盘。接着,InnoDB存储引擎会合并插入缓冲,不同于每秒一次操作时可能发生的合并插入缓冲操作,这次的合并插入缓冲总是会进行。之后InnoDB存储引擎会在进行一次将日志刷新到磁盘。这和每秒一次时发生的操作是一样的。在接下来InnoDB存储引擎会执行full purge操作,即删除无用的Undo页。在full purge过程中,InnoDB存储引擎会判断当前事务系统中已被删除的行是否可以删除,如果可以,则InnoDB会立即将其删除。每次最多尝试回收20个undo页。然后,InnoDB存储引擎会判定缓冲池中脏页的比列如果有超过70%的脏页,则刷新100个脏页到磁盘。如果比例小于70%则只需要刷新10%的脏页到磁盘。
若当前没有用户活动(上巨款空闲时)或者数据库关闭(shutdown),就会切换到这个循环。background loZ喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcLvhu+HWtNDQ0tTPwrLZ1/c6PGJyPgogICAgICAgICAgICBhLsm+s/3O3tPDtcRVbmRv0rMo19zKxyk7PGJyPgogICAgICAgICAgICBiLrrPsqIyMLj2suXI67u6s+Uo19zKxyk7PGJyPgogICAgICAgICAgICBjLsz4u9i1vdb30a27tyjX3MrHKTs8YnI+CiAgICAgICAgICAgIGQusru2z8ui0MIxMDC49tKz1rG1vbf7us/M9bz+KL/JxNwszPjXqrW9Zmx1c2ggbG9vcNbQzeqzySk7PGJyPgogICAgICAgIMj0Zmx1c2ggbG9vcNbQw7vKssO0ysLH6b/J0tTX9qOsSW5ub0RCtOa0otL9x+a74cfQu7u1vXN1c3BlbmQgbG9vcKOsvatNYXN0ZXIgVGhyZWFkudLG8KOstci0/cqxvOS1xLeiyfqho8j008O7p8b008MoZW5hYmxlKcHLSW5ub0RCtOa0otL9x+ajrMi0w7vT0Mq508PIzrrOSW5ub0RCtOa0otL9x+a1xLHto6zEx8O0TWFzdGVyIFRocmVhZNfcyse0ptPaudLG8LXE17TMrKGjPGJyPgogICAgMi5Jbm5vREIgMS4yLniw5rG+1q7HsLXETWFzdGVyIFRocmVhZDxicj4KICAgICAgICDU2klubm9EQjEuMC54sOaxvtaux7CjrElubm9EQrTmtKLS/cfmttTT2klPxuTKtcrH09DP3rXEo6zU2ru6s+Wz2M/rtMXFzMui0MLKscbkyrW2vNf2wcvSu7aotcTTsrHgwusoaGFyZCBjb2RpbmcpoaPU2lNTRLP2z9bWrrrzo6zV4tbWuea2qNTauty087PMtsjJz8/e1sbBy0lubm9EQrTmtKLS/cfmttS0xcXMSU+1xNDUxNyjrNPIxuTKx9C0yOvQ1MTcoaO008eww+a1xL3pydzAtL+0o6zO3sLbus7KsaOsSW5ub0RCtOa0otL9x+bX7rTz1ru74cui0MIxMDC49tKztb20xcXMo6y6z7KiMjC49rLlyOu7urPloaPI57n7ysfU2tC0yOvD3LyvtcTS/dPDs8zQ8tbQo6zDv8Prv8nE3LvhsvrJ+rTz09oxMDC49rXE1ODSs6OsyOe5+8rHsvrJ+rTz09oyMLj2suXI67u6s+W1xMfpv/ajrE1hc3RlciBUaHJlYWQmIzIwMjg0O7r119zKx7vhJnF1b3Q7w6ayu7n9wLQmcXVvdDuho7y0yrm0xcXMxNzU2jHD68TatKbA7bbg0+AxMDC49tKztcTQtMjrus0yMLj2suXI67u6s+W1xLrPsqKjrLWrysfTydPaaGFyZAogY29kaW5nLE1hc3RlciBUaHJlYWTSsta7u+HRodTxy6LQwjEwMLj21ODSs7rNus+yojIwuPay5cjru7qz5aGjzazKsaOstbG3osn65bS7+tDo0qq71ri0ysejrNPJ09q63Lbgyv2+3bu5w7vT0Mui0MK72LTFxcyjrLvYtb3Iy7vWuLS1xMqxvOS/z8Tc0OjSqrrcvsOho9XrttTV4rj2zsrM4klubm9EQiBQbHVnaW4otNNJbm5vREIxLjAueLDmsb6/qsq8KczhuanBy7LOyv1pbm5vZGJfaW9fY2F0YWNpdHmjrNPDwLSx7cq+tMXFzElPtcTNzM3Cwb+jrMSsyM8yMDCho7bU09rLotDCtb20xcXM0rO1xMr9wb+jrLvhsLTV1Wlubm9kYl9pb19jYXBhY2l0ebXEsNm31rHIwLS9+NDQv9jWxqGjuebU8sjnz8I6PGJyPgogICAgICAgICAgICBhLtTaus+yorLlyOu7urPlyrGjrLrPsqKy5cjru7qz5bXEyv3Bv86qaW5ub2RiX2lvX2NhcGFjaXR5JiMyMDU0MDu1xDUwJTs8YnI+CiAgICAgICAgICAgIGIu1Nq007u6s+XH+Mui0MLU4NKzyrGjrMui0MK1xNTg0rO1xMr9wb/Oqmlubm9kYl9pb19jYXBhY2l0eTs8YnI+CiAgICAgICAgyPTTw7unyrnTw8HLU1NEwOC1xLTFxcyjrLvy1d+9q7y4v+m0xcXM1/bBy1JBSUSho7WxtOa0osnosbjTtdPQuPy437XESU/L2bbIysejrL/J0tS9q2lubm9kYl9pb19jYXBhY2l0ebXEJiMyMDU0MDu197Tz0LSjrNaqtcC3+7rPtMXFzElPtcTNzM3Cwb+ho0lubm9EQjEuMC54sOaxvrXEwe3Su7j2ss7K/Wlubm9kYl9hZGFwdGl2ZV9mbHVzaGluZyjX1MrK06a12Mui0MIpo6y4wyYjMjA1NDA707DP7MO/w+vLotDC1ODSs7XEyv3Bv6Gj1K3AtLXEy6LQwrnm1PLKxzrU4NKz1Nq7urTmy/nVvLHIwP3QodPaaW5ub2RiX21heF9kaXJ0eV9wYWdlc19wY3TKsaOssrvLotDC1ODSs6OstPPT2mlubm9kYl9tYXhfZGlydHlfcGFnZXNfcGN0yrGjrMui0MIxMDC49tTg0rOho8vm18Vpbm5vZGJfYWRhcHRpdmVfZmx1c2hpbmeyzsr9tcTS/cjro6xJbm5vREK05rSi0v3H5rvhzai5/dK7uPZidWZfZmx1c2hfZ2V0X2Rlc2lyZWRfZmx1c2hfcmF0ZbXEuq/K/cC0xdC2z9Do0qrLotDC1ODSs9fuus/KyrXEyv3Bv6GjtPPWwrXE1/a3qMrHzai5/cXQts+y+sn61tjX9sjV1r61xMvZtsjAtL72tqjX7rrPysq1xMui0MLU4NKzyv3Bv6Gj0vK0y6OstbHU4NKztcSxyMHQ0KHT2mlubm9kYl9tYXhfZGlydHlfcGFnZXNfcGN0yrGjrNKyu+HLotDC0ru2qMG/tcTU4NKzoaM8YnI+CjxwPiAgICAgICAgu7nT0NK7uPa4xLHkysc61q7HsMO/tM69+NDQZnVsbCBwdXJnZbLZ1/fKsaOs1+624LvYytUyMLj2VW5kb9KzoaO000lubm9EQjEuMC54sOaxvr+qyrzS/cjrss7K/Wlubm9kYl9wdXJnZV9iYXRjaF9zaXplo6y4w7LOyv2/ydLUv9jWxsO/tM5mdWxsIHB1cmdlu9jK1bXEVW5kb9KztcTK/cG/o6zErMjPMjCho7/J0tS2r8ystcS21MbkvfjQ0NDeuMSho82ouf3D/MHuc2hvdyBlbmdpbmUgaW5ub2RiIHN0YXR1c7/J0tSy6b+0tbXG2k1hc3RlciBUaHJlYWS1xNe0zKzQxc+ioaPI58/Czbw6PC9wPgo8cD48aW1nIHNyYz0="http://img.blog.csdn.net/20141209120143421" alt="\">
有图可知,主循环进行了1154432次,每秒挂起(sleep)的操作进行了1154432次,10秒一次的活动进行了106465次,background loop进行了90829次,flush loop进行了90829次。
3.InnoDB 1.2.x版本的Master Thread
InnoDB 1.2.x版本中,Master Thread的伪代码如下:
InnoDB存储引擎之MasterThread系统的并发性。