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链表性能。



原创粉丝点击