innodb buffer pool管理--LRU插入
来源:互联网 发布:excel删除一列数据 编辑:程序博客网 时间:2024/05/17 08:05
buf_LRU_add_block->buf_LRU_add_block_low //buf_page_t有该页属于的buffer pool对象 buf_pool_t*buf_pool = buf_pool_from_bpage(bpage); //如果old为FALSE,即不向old插;或者LRU链表长度小于512 //插入到LRU链表头部 if (!old || (UT_LIST_GET_LEN(buf_pool->LRU) < BUF_LRU_OLD_MIN_LEN)) { UT_LIST_ADD_FIRST(LRU, buf_pool->LRU, bpage); bpage->freed_page_clock = buf_pool->freed_page_clock; }else{ //否则插在LRU_old后 UT_LIST_INSERT_AFTER(LRU, buf_pool->LRU, buf_pool->LRU_old,bpage); buf_pool->LRU_old_len++; } incr_LRU_size_in_bytes(bpage, buf_pool); //1)LRU长度>512,调整 //2)LRU==512,设置一个old //3)否则,设置bpage if (UT_LIST_GET_LEN(buf_pool->LRU) > BUF_LRU_OLD_MIN_LEN) { buf_page_set_old(bpage, old); buf_LRU_old_adjust_len(buf_pool); }else if (UT_LIST_GET_LEN(buf_pool->LRU) == BUF_LRU_OLD_MIN_LEN) { buf_LRU_old_init(buf_pool); }else { //开始的512页都是oldbuf_page_set_old(bpage, buf_pool->LRU_old != NULL); }
buf_LRU_old_init //将512个页都初始化为old for (bpage = UT_LIST_GET_LAST(buf_pool->LRU); bpage != NULL;bpage = UT_LIST_GET_PREV(LRU, bpage)) {bpage->old = TRUE; } //设置LRU的old指针,为LRU首个page buf_pool->LRU_old = UT_LIST_GET_FIRST(buf_pool->LRU); buf_pool->LRU_old_len = UT_LIST_GET_LEN(buf_pool->LRU); //调整old指针 buf_LRU_old_adjust_len(buf_pool); 调整方法: //old_len==512,new_len=min(512*378/1024, 512-25),其实是512的3/8 // buf_pool->LRU_old_ratio 为378(innodb_old_blocks_pct默认值是37) old_len = buf_pool->LRU_old_len; new_len = ut_min(UT_LIST_GET_LEN(buf_pool->LRU) * buf_pool->LRU_old_ratio / BUF_LRU_OLD_RATIO_DIV, UT_LIST_GET_LEN(buf_pool->LRU)- (20+ 5)); for (;;) { buf_page_t*LRU_old = buf_pool->LRU_old; if (old_len +20 < new_len) { buf_pool->LRU_old = LRU_old = UT_LIST_GET_PREV(LRU, LRU_old); old_len = ++buf_pool->LRU_old_len; buf_page_set_old(LRU_old, TRUE); }else if (old_len > new_len +20) { //512的前209个大概都是young buf_pool->LRU_old = UT_LIST_GET_NEXT(LRU, LRU_old); old_len = --buf_pool->LRU_old_len; buf_page_set_old(LRU_old, FALSE); }else{ Return; } }
总结:
1、 初始时,总是向头部插入,并且都设置为young。(LRU长度小于512的情况)
2、 LRU长度等于512时,开始调整:
1) 将所有页设置为old
2) 调整到3/8处,即前209个为young,后面的设置为old,并且设置LRU_old位置及old部分长度
3) 注意每次都会重整LRUlist链表
3、 LRU长度大于512时,直接插到buf_pool->LRU_old后面,从LRU_old开始向后调整开始位置
4、 20即BUF_LRU_OLD_TOLERANCE,指定了LRU_old部分长度可以偏离正常长度的振幅。可以减少LRU链表重整次数,提高LRU链表性能。
阅读全文
1 0
- innodb buffer pool管理--LRU插入
- innodb buffer pool管理--LRU调整
- innodb buffer pool管理--LRU old何时make young
- innodb buffer pool管理--LRU young何时make old
- innodb buffer pool管理--flush list
- innodb buffer pool管理--free list
- Innodb buffer pool struct
- The InnoDB Buffer Pool
- innodb buffer pool
- InnoDB Buffer Pool 说明
- innodb buffer pool
- innodb buffer pool管理--数据页的访问
- 14.3.3 InnoDB Buffer Pool Configuration InnoDB Buffer Pool 配置:
- 快速预热innodb buffer pool
- [置顶]Innodb Buffer Pool内部结构
- 8.10.1 The InnoDB Buffer Pool
- 8.10.1 The InnoDB Buffer Pool
- 14.4.3.1 The InnoDB Buffer Pool
- pointer_1
- HDU 5953 Game of Taking Stones(威佐夫博弈+高精度+二分)——The 2016 ACM-ICPC Asia Dalian Regional Contest
- 牛腩总结(二)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- java常考笔试题2
- innodb buffer pool管理--LRU插入
- Node.js 常用工具
- 链接时重定位
- Spark学习起步(二):sparkContext
- 红黑树
- 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心
- VirtualBox报错:ntdll.dll not found in child process(rc=-610)
- ADT配置内置模拟器
- Django05-模板