美文网首页
MySQL-Innodb-Flush

MySQL-Innodb-Flush

作者: 多血 | 来源:发表于2020-10-07 23:29 被阅读0次

    刷脏的种类

    • 批量刷脏
    • 单页刷脏操作
      批量刷脏是后台线程发起,单页刷脏操作是用户线程发起。
      批量刷脏中的同步刷脏是Redo空间不足引发的,单页刷脏是没有free的page引发的。

    批量刷脏

    批量刷脏的场景
    https://www.jianshu.com/p/4e20c13027f4
    正常刷脏场景下FlushPages数量计算方法
    https://www.jianshu.com/p/60d532156264
    批量刷脏线程实现
    批量刷脏的具体执行
    https://www.jianshu.com/p/4d981ec20ca6
    Hazard Pointer的设计与实现
    https://www.jianshu.com/p/4b982c3b5013

    单页刷脏

    单页刷脏的具体实现
    https://www.jianshu.com/p/080056afa842

    刷脏后的逻辑

    是否从lru和flus里面删除
    所以在page cleaner thread 执行flush 操作以后, 在写IO 完成以后, 是否会把page 同时从flush_list, LRU list 同时删除, 还是只是将oldest_modification lsn 设置成0 就可以了?

    这里分两种场景考虑:

    如果这个page 是从flush_list 上面写IO 完成, 那么就不需要从flush_list上面删除, 因为从flush list 上面删除要完成的操作是刷脏,既然只是为了刷脏, 那么就没必要让他从lru list 上面删除, 有可能这个page 被刷脏了, 还是一个热page 是需要访问的

    如果这个page 是从lru_list 上面写IO 完成, 那就需要从lru list 上面删除

    原因: 从lru_list 上面删除的page 肯定说明这个page 不是hot page 了,更大的原因可能是buffer pool 空间不够, 需要从lru list 上面淘汰一些page了, 既然这些page 是要从lru list 上面淘汰的, 那么肯定就需要从LRU list 上面移除

    具体代码在buf_page_io_complete() 中

    buf_page_io_complete{
        case BUF_IO_WRITE:
            /* Write means a flush operation: call the completion
            routine in the flush system */
    
            buf_flush_write_complete(bpage);
    
            if (uncompressed) {
                rw_lock_sx_unlock_gen(&((buf_block_t*) bpage)->lock,
                              BUF_IO_WRITE);
            }
    
            buf_pool->stat.n_pages_written++;
    
            /* We decide whether or not to evict the page from the
            LRU list based on the flush_type.
            * BUF_FLUSH_LIST: don't evict
            * BUF_FLUSH_LRU: always evict
            * BUF_FLUSH_SINGLE_PAGE: eviction preference is passed
            by the caller explicitly. */
            if (buf_page_get_flush_type(bpage) == BUF_FLUSH_LRU) {
                evict = true;
            }
    
            if (evict) {
                mutex_exit(buf_page_get_mutex(bpage));
                buf_LRU_free_page(bpage, true);
            } else {
                mutex_exit(buf_page_get_mutex(bpage));
            }
    
            break;
    }
    

    相关文章

      网友评论

          本文标题:MySQL-Innodb-Flush

          本文链接:https://www.haomeiwen.com/subject/wjpbyktx.html