背景
在写压力负载比较重的MySQL实例上,InnoDB可能积累了较长的没有被purge掉的transaction history,导致实例性能的衰减,或者空闲空间被耗尽,下面就来看看它是怎么产生的,或者有没有什么方法来减轻,避免这样的问题出现。
InnoDB purge 概要
InnoDB是一个事务引擎,实现了MVCC特性,也就是在存储引擎里对行数据保存了多个版本。在对行数据进行delete或者update更改时,行数据的前映像会保留一段时间,直到可以被删除的时候。
在大部分OLTP负载情况下,前映像会在数据操作完成后的数秒钟内被删除掉,但在一些情况下,假设存在一些持续很长时间的事务需要看到数据的前映像,那么老版本的数据就会被保留相当长一段时间。
虽然MySQL 5.6版本增加了多个purge threads来加快完成老版本数据的清理工作,但在write-intensive workload情况下,不一定完全凑效。
测试案例
Peter Zaitsev 使用sysbench的update进行的测试,无论是 innodb_purge_threads=1 还是8的时候,显示的transaction history快速增长的情况,如下图所示:
transaction history增长情况
下面看一下同步测试过程中purge的速度(可以通过I_S.innodb_metrics进行查询):
InnoDB purge 情况
显示在并发 process 的过程中,purge thread 其实处在饥饿状态,待sysbench结束,purge线程满载运行清理工作。
对于这个测试结果,这里需要说明下:
对于Peter Zaitsev的测试,其实主要是为了说明transaction history的情况,如果是用sysbench进行小事务的OLTP测试,并不会产生这么明显的transaction history增长而purge threa