造成mysqldump缓冲池的污染研究
Oracle的MySQL最近发布在其官方博客上一些5.6变量的默认值的修改,innodb_old_blocks_time默认值是从0到1000取代(1S)
关于这个参数的作用的摘录如下:
在毫秒(ms)多久一块插入老子要搬到新的子列表第一次访问后留在那里。增加此值可以防止缓冲池被仅在短时间内引用的数据填充,如在整个表扫描期间。
其效果是减少一个单一的大批量数据查询的污染(类似于mysqldump行为)的缓冲池(以下简称BP)。
在这种情况下,我们必须提到BP的中点插入机制。
下面将对这一机制进行一定的分析和探讨。
1。缓冲池插入机制
BP可以被认为是一种长链列表。它分为新旧两部分,其中老37%的默认大小(配置innodb_old_blocks_pct)。Page,这是接近顶部,表明问题是最近问。近端网页表明它已不在长时间的访问,以及两者的交叉部分变成中点。每当一个新的页面需要加载到BP,页面插入中点的位置和被宣布为old-page.when页面的旧的部分是访问,页面将在列表的顶部,确定为年轻。
因为表操作的扫描是首先加载页面,然后访问立即触发。所以当innodb_old_blocks_time = 0,页表扫描不需要读年轻页添加到列表的顶部。一些不常用的页面将被挤出的BP,使得后续的SQL生成磁盘IO,导致在一个较慢的响应。这也是在标题中提到的BP污染。
两。修改innodb_old_blocks_time效果
Percona也做过相关试验。当时间= 0结束时,正常访问的吞吐量减少到10%。当时间= 1000时,吞吐量与没有备份的性能一致。
这是真的吗让我们亲自测试一下。
以下是测试的结果:
In this case, concurrency represents the value of --num-threads in sysbench.
选择代表过QPS在这种环境下不就。
剩下的两列代表过QPS mysqldump,分别。
并发
选择
old_time = 0
old_time = 1000
一
一万七千三百九十四
一千八百三十六
二千一百四十一
二
二十九万七百零三
三千六百七十
三千九百八十一
三
四十七万三百四十七
五千六百八十三
六千五百四十
四
六十四万七百一十七
六千八百零五
八千三百三十七
五
八十三万五百五十一
八千六百七十六
一万五千八百八十五
六
九十九万三百九十六
一万二千九百七十八
一万九千八百九十三
七
十一万二千三百三十
一万六千四百九十一
二十六千二十二
八
十二万六千六百
二十三万八百四十
三十三万三百四十六
九
十三万八千四百六十八
三万零七百六十
三十九万一百九十四
十
十五万零三百六十五
三十九千三十四
四十八万九百二十五
十一
十六万三千零五十三
四十三万一百七十四
六万零三百五十二
十二
十七万四千九百一十六
五十二千六十六
七万零一百八十
十三
十七万四千一百六十
六十三万八百五十三
七十八千七十六
十四
十七万三千七百八十六
六十五万一百六十四
八万零六百六十一
十五
十七万四千二百六十八
七万零九百六十五
九万零六百三十三
十六
十七万五千零四十四
八万零八百七十一
十万二千六百二十九
十七
十七万五千五百八十三
九万零六百八十九
十万三千四百二十三
十八
十七万五千九百三十九
九十四万八百零五
十一万二千六百二十九
十九
十七万五千一百一十四
九十三万三百零三
十二万零六百二十五
正如您所看到的,时间= 1000并不能极大地提高查询性能,在最好的情况下,它比时间= 0更好80%。
为什么
不难理解表中的并发性很大程度上决定了页面测试的冷热程度,并发请求的数量越多,每边产生的并行请求越多,访问的每个页面的频率也就越高。页面在LRU列表的位置也在上面。反之亦然 u3002
让我们考虑一下高频热数据访问的情况。此时,虽然mysqldump访问页将继续在LRU的最高负荷,高频率的热点数据的访问将页再到LRU的顶部。因此,页面通过mysqldump加载将迅速刷下来立即退出(淘汰)。作为一个结果,时间= 0或1000不会有这种压力的环境有很大的影响,因为转储的数据简单地抢占热点数据。
以同样的方式,在超低频率的数据访问是一样的。由于数据访问频率低,大量的页面是在LRU列表的末尾。所以无论倾倒的页面加载头或中点,它将在炎热的数据面前,说,在任何情况下,数据页将被淘汰。因此,这种压力环境的性能没有波动的时间价值是多少。
真正能享受时间利益的是那些处于中点边缘的人。
从下面的图中可以看到,性能的提高主要集中在介质访问,即37%。
三点中点位置的影响
可以从前面的分析,innodb_old_blocks_time作用范围是对page.innodb_old_blocks_pct冷热条件直接相关,也决定了BP的数据分布。
然后innodb_old_blocks_pct调整影响的innodb_old_blocks_time范围。
曲线上面显示的视图。当innodb_old_blocks_pct调为60%,波峰也转化为60%。
总结:
1。innodb_old_blocks_time = 1000,在一定程度上可以减少对数据库性能的影响就访问。
2的优化效果。innodb_old_blocks_time = 1000是有限的,它可以接近中点页面带来的最大效果。