innodb buffer pool管理--LRU old何时make young

来源:互联网 发布:mac传奇单机版 编辑:程序博客网 时间:2024/05/08 23:44
buf_LRU_make_block_young(buf_page_t*bpage)    buf_LRU_remove_block(bpage);    buf_LRU_add_block_low(bpage, FALSE);//插入到头    //make young函数将该页从LRU中删除,然后再插入到头部
buf_page_make_young_if_needed ->buf_page_make_young-> buf_LRU_make_block_young关注make young的条件:buf_page_peek_if_too_old(bpage)if (buf_pool->freed_page_clock == 0) {    //当前buf pool没有evict任何page,说明buf pool足够大,page能够完全放到内    //存,不需将page从LRU_old移动到LRU_head    return(FALSE);} else if (buf_LRU_old_threshold_ms && bpage->old) {    //最近一次访问时间    unsignedaccess_time = buf_page_is_accessed(bpage);    if(access_time>0 && (ut_time_ms() - access_time) >= buf_LRU_old_threshold_ms){       return TRUE;    }    buf_pool->stat.n_pages_not_made_young++;    return FALSE;} else {    //下面判断当前page是否足够新,属于MRU,则不需移动return(!buf_page_peek_if_young(bpage));        return((buf_pool->freed_page_clock & ((1UL << 31) - 1))       < ((ulint) bpage->freed_page_clock  + (buf_pool->curr_size     * (BUF_LRU_OLD_RATIO_DIV - buf_pool->LRU_old_ratio)     / (BUF_LRU_OLD_RATIO_DIV * 4))));}

1、buf_page->access_time初始化为0,该值是访问的具体时间

2、innodb_old_blocks_time决定buf_LRU_old_threshold_ms,默认值是1000即1S

3、本次访问时间距离上次访问时间超过1S,就将该页移动到LRU首部

4、buf_page_peek_if_young公式的意思:

   buf_pool->freed_page_clock:本 buf pool一共evict了多少页

   bpage->freed_page_clock  :本page最后一次移动到buf LRU_head时,buf pool当时的freed_page_clock取值

   buf_pool->curr_size:当前buf pool使用的页面数量

   BUF_LRU_OLD_RATIO_DIV:buf_pool->LRU_old_ratio的坟墓,取值1024

   buf_pool->LRU_old_ratio:buf pool oldLRU的占比。以1024为分母。

                         默认3/8的情况下,为378

 

  解释:从page上一次移动到LRU_head以来,buf pool在此期间evict的page数量超过buf poolLRU young list 长度的1/4,那么说明本page已经不够年轻,本次访问需要移动page到LRU_head,否则说明该page属于MRU,不需要移动