注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

将InnoDB缓冲池中的页写入L2 Cache 之 将换出的压缩页正确写入  

来自wzpywzh   2013-11-14 14:03:07|  分类: MySQL |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  上篇扯的东西都是跟InnoDB相关的,其实完全可以不用将L2 Cache牵涉进来,跟标题也没啥关系,本篇先说明缘由吧,之所以这么深究buf pool的页换出流程原因是当前L2 Cachebuf pool页换出的处理方式不够优雅,目前L2 Cache的做法是如果是非压缩页(指的是对应的表没有设置启用压缩),那么在buf pool做页换出时将对应数据写入SSD,对应的操作在buf_LRU_block_remove_hashed_page函数中,L2 Cache对应接口是fc_LRU_movefc_LRU_move_batch,对应的函数已提到;但是对于压缩页,虽然L2 Cache的接口一样,但时机不同,是在buf pool将压缩页从HDD读入buf pool时就缓存到SSD中,对应的buf pool接口为buf_read_page_low,根据同步还是异步读的不同,L2 Cache对应的接口分别为fc_read_pagefc_compelete_read其实这个时候将页写入SSD是没有好处的,因为写入后也命中不了,同时又占据了SSD空间

  那么,为什么不统一在buf_LRU_block_remove_hashed_page中进行呢,其实据说在很早以前,确实这么处理,可能的代码如下。但是发现如果是压缩页,在fc_LRU_movebuf_page_is_corrupted检查时,有时会提示corrupt,所以临时调整为上述做法。

buf_LRU_block_remove_hashed_page

case BUF_BLOCK_FILE_PAGE:

if (fc_is_enabled() && trx_doublewrite && srv_flash_cache_enable_write //&& !bpage->zip.data, 原来可能的做法

){

    /*only allow uncompressed page to flash cache */

                            srv_flash_cache_lru_move_batch ?

                                     fc_LRU_move_batch(bpage): fc_LRU_move(bpage);

}

通过上一篇的分析,可以得到这样的结论,对于非压缩页,lru换出肯定是完全换出,所以需要写入到L2 Cache中,而对于压缩页,只有在做完全换出时,将其写入到L2 Cache中才有价值。且还有一个很重要的点是压缩页做部分换出时,这个页面可能是脏的,因为只是把解压的页扔了,压缩页的脏数据还在,所以不会造成数据的丢失。这个从函数中的语句: ut_a(!zip || bpage->oldest_modification == 0)也可以发现。

由于对脏页更新LSN和计算校验和的操作是在刷新脏页时进行,即在buf_flush_init_for_writing中。所以,如果将buf_LRU_block_remove_hashed_page中做部分换出的页写入到SSD,写入的就有可能是脏页,此时LSN和校验和没有被更新,所在调用buf_page_is_corrupted检查校验和时就出错了。上面就回答了为什么在L2 Cache采用相同的方式处理buf pool换出的压缩页和非压缩页时,压缩页报错的原因。解决的方法很简单,就是对于压缩页,只在做完全换出时才将其写入到SSD。在buf_LRU_block_remove_hashed_page中通过zip是否置位进行判断即可。所以,代码可以修改为:

buf_LRU_block_remove_hashed_page(

/*=============================*/

         buf_page_t*    bpage,      ibool zip)  /*!< in: TRUE if should remove also the

                                     compressed page of an uncompressed page */

{

case BUF_BLOCK_FILE_PAGE:

if (fc_is_enabled() && trx_doublewrite && srv_flash_cache_enable_write && !bpage->zip.data){

    /*only allow uncompressed page to flash cache */

                            srv_flash_cache_lru_move_batch ?

                                     fc_LRU_move_batch(bpage): fc_LRU_move(bpage);

}  //维持不变

….

            if (bpage->zip.data) {

                      ut_a(!zip || bpage->oldest_modification == 0);

                     switch (UNIV_EXPECT(fil_page_get_type(page),

                                            FIL_PAGE_INDEX)) 

}

            if (zip && bpage->zip.data) {

                     /* Free the compressed page. */

                     if ( fc_is_enabled() && trx_doublewrite && srv_flash_cache_enable_write) {

         /*move zip page to flash cache when buf pool also free the compressed page*/

                               srv_flash_cache_lru_move_batch ?

                                        fc_LRU_move_batch(bpage): fc_LRU_move(bpage);

                     } //新增的用于在完全换出压缩页时将压缩页数据写入到SSD

                     void*         data = bpage->zip.data;

                     bpage->zip.data = NULL;

                     buf_buddy_free(buf_pool, data,page_zip_get_size(&bpage->zip));

                    

            }

            return(BUF_BLOCK_REMOVE_HASH);

….

}

  评论这张
 
阅读(609)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017