innodb buffer pool相关特性
背景
innodb buffer pool作为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能。因此在数据库发生变更,比如重启、主备切换实例迁移等等,innodb buffer poll 需要一段时间预热,期间数据库的性能会受到明显影响。
另外mysql 5.7以前innodb buffer pool缓存大小修改不是动态的,重启才能生效。因此innodb buffer pool的预热和innodb buffer pool大小的动态修改,对性能要求较高的应用来说是不错的特性,下面我来看看这两个特性的具体实现。
buffer pool 预热
mysql 5.6以后支持buffer pool预热功能。引入了以下参数, 参数具体含义参见官方文档
innodb_buffer_pool_load_now
innodb_buffer_pool_dump_now
innodb_buffer_pool_load_at_startup
innodb_buffer_pool_dump_at_startup
innodb_buffer_pool_filename
buffer pool预热分为dump过程和load过程,均由后台线程buf_dump_thread完成。
比如用户发起set命令
set global innodb_buffer_pool_dump_now=on;
set global innodb_buffer_pool_load_now=on;
set 命令会立刻返回,具体操作由buf_dump_thread来实现。
dump 过程
锁buf_pool
遍历LRU链表,将(space, pageno) 先收集到数组
释放锁
再将数据写入innodb_buffer_pool_filename定有的文件中load过程
从文件读入数组
按(space,pageno)排序数据
依次同步读取页到buffer pool中
dump过程一般比较快,而load过程相对要慢些。
通过Innodb_buffer_pool_dump_status、Innodb_buffer_pool_load_status可查看dump/load的状态
另外5.7引入了performance_schema.events_stages_current来显示load进度,每load 32M会更新一条进度信息
select * from performance_schema.events_stages_current;
THREAD_ID 19
EVENT_ID 1367
END_EVENT_ID NULL
EVENT_NAME stage/innodb/buffer pool load
SOURCE buf0dump.cc:619
TIMER_START 33393877311000
TIMER_END 33398961258000
TIMER_WAIT 5083947000
WORK_COMPLETED 0
WORK_ESTIMATED 1440
NESTING_EVENT_ID NULL
NESTING_EVENT_TYPE NULL
WORK_ESTIMATED表示总page数
WORK_COMPLETED表示当前已load page数
dump文件的数据格式如下
#cat ib_buffer_pool |more
0,7
0,1
0,3
0,2
0,4
0,11
0,5
0,6
dump文件比较简单,我们可以编辑此文件来预加载指定page,比较灵活。
buffer pool 动态调整大小
5.7 开始支持buffer pool 动态调整大小,每个buffer_pool_instance都由同样个数的chunk组成(chunks数组), 每个chunk内存大小为innodb_buffer_pool_chunk_size(实际会偏大5%,用于存放chuck中的block信息)。buffer pool以innodb_buffer_pool_chunk_size为单位进行动态增大和缩小。调整前后innodb_buffer_pool_size应一直保持是innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数。
同样的buffer pool动态调整大小由后台线程buf_resize_thread,set命令会立即返回。通过InnoDB_buffer_pool_resize_status可以查看调整的运行状态。
resize流程
- 如果开启了AHI,需禁用AHI
- 如果是收缩内存
- 计算需收缩的chunk数, 从chunks开始尾部删除指定个数的chunk.
- 锁buf_pool
- 从free_list中摘除待删chunk的page放入待删链表buf_pool->withdraw
- 如果待删chunk的page为脏页,则刷脏
- 重新加载LRU中要删除的页,从LRU中摘除,重新从free列表获取page老的page放入待删链表buf_pool->withdraw
- 释放buffer pool锁
- 如果需收缩的chunk pages没有收集全,重复2-6
- 开始resize
- 锁住所有instance的buffer_pool,page_hash
- 收缩pool:以chunk为单位释放要收缩的内存
- 清空withdraw列表buf_pool->withdraw
- 增大pool:分配新的chunk
- 重新分配buf_pool->chunks
- 如果改变/缩小超过2倍,会重置page hash,改变桶大小
- 释放buffer_pool,page_hash锁
- 如果改变/缩小超过2倍,会重启和buffer pool大小相关的内存结构,如锁系统(lock_sys_resize),AHI(btr_search_sys_resize), 数据字段(dict_resize)等
- 如果禁用了AHI,此时开启
由上可以看出,扩大内存比缩小内存相对容易些。缩小内存时,如果遇到有事务一直未提交且占用了待收缩的page时,导致收缩一直重试,error log会打印这种重试信息,
包含可能引用此问题的事务信息。为了避免频繁重试,每次重试的时间间隔会指数增长。
以上步骤中resize阶段buffer pool会不可用,此阶段会锁所有buffer pool, 但此阶段都是内存操作,时间比较短。收缩内存阶段耗时可能会很长,也有一定影响,但是每次都是以instance为单位进行锁定的。
总的来说,buffer pool 动态调整大小对应用的影响并不大。
重新加载LRU中要删除的页的影响
search 过程中btr游标保存的page可能重新加载过,自适应哈希保存的root page也可能重新加载过, 都需要重新读取。
总结
buffer pool 预热 和buffer pool 动态调整大小,这两功能相辅相承的。buffer pool 动态调整大小只适用于实例在主机本地升级的情况,如果用户修改buffer pool大小,同时涉及跨机迁移,那么buffer pool 预热功能就排上用场了。
另外buffer pool 动态调整尽量在业务低锋时进行。
innodb buffer pool相关特性的更多相关文章
- MySQL · 引擎特性 · InnoDB Buffer Pool
前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...
- Innodb buffer pool/redo log_buffer 相关
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理.在数据库系统中,由于CPU速度和磁盘速度之前的鸿沟,通常使用缓冲池技术来提高数据库的整体性能. 1. Innodb_buffe ...
- innodb buffer pool小解
INNODB维护了一个缓存数据和索引信息到内存的存储区叫做buffer pool,他会将最近访问的数据缓存到缓冲区.通过配置各个buffer pool的参数,我们可以显著提高MySQL的性能. INN ...
- 14.6.3.1 The InnoDB Buffer Pool
14.6.3.1 The InnoDB Buffer Pool InnoDB 保持一个存储区域被称为buffer pool 用于cache数据和索引在内存里, 知道InnoDB buffer pool ...
- 14.4.3.1 The InnoDB Buffer Pool
14.4.3.1 The InnoDB Buffer Pool 14.4.3.2 Configuring Multiple Buffer Pool Instances 14.4.3.3 Making ...
- 在线调整InnoDB Buffer Pool Size
InnoDB Buffer Pool主要是用来缓存数据表和索引数据的内存区域,它的默认值为134217728字节(128MB).最大值取决于CPU架构;32位系统上的最大值为4294967295(23 ...
- 理解innodb buffer pool
今天组里有个同事说可以查看innodb buffer pool每个表和索引占的大小,为此我搜了下,还真有方法,记录下. innodb buffer pool有几个目的: 缓存数据--众所周知,这个占了 ...
- [转]MySQL innodb buffer pool
最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...
- MySQL · 性能优化· InnoDB buffer pool flush策略漫谈
MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...
随机推荐
- artTemplate里一个比不上jQuery tmpl模板的地方就是放一个数组进去它不会自动循环.
artTemplate里一个比不上jQuery tmpl模板的地方就是放一个数组进去它不会自动循环.
- Linux内核【链表】整理笔记(2)
关于链表我们更多时候是对其进行遍历的需求,上一篇博文里我们主要认识了一下和链表操作比较常用的几个内核API接口,其入参全都是清一色的struct list_head{}类型.至于链表的遍历,内核也有一 ...
- python学习-day14-前端之html、css
一.Html 1.本质:一个规则,浏览器能任务的规则 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ***** ...
- [php-src]扩展中封装业务与 call_user_function 的使用建议
内容均以php5.6.14为例. 从一个封装 uniqid 的例子来讲. /* {{{ wrapper of uniqid */ PHP_FUNCTION(fox) { // #1. zval *pr ...
- 一个Email
Email 1.接受表单数据并用单独变量保存起来,判断用户协议,这个是必须同意的.2.判断验证码,利用验证码类Captcha.3.判断用户名,密码,邮箱规则,利用Verify类验证.4.判断唯一性,邮 ...
- maven 三个基本插件 clean dependency compiler
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- jenkins---配置邮件
如果出现以下错误: 553 mail from must equal authorized user 看看管理员邮箱是否配置: 再测试,就能够正常收到邮件了!
- VS2010--canot determine the locationof the vs common tools folder
在vcvars32.bat第一行后复制 @SET VSINSTALLDIR=c:\Program Files\Microsoft Visual Studio 10.0 @SET VCINSTALLDI ...
- Entity Framework 6, database-first with Oracle
Entity Framework 6, database-first with Oracle 转载自http://csharp.today/entity-framework-6-database-fi ...
- button、label、textfield、页面跳转、传值
.AppDelegate.m #import “OneViewController.h” //一打开就运行的 -(BOOL)application:(UIApplication *)applicati ...