MySQL-Innodb-Flush

2020-10-07  本文已影响0人  多血

刷脏的种类

批量刷脏

批量刷脏的场景
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;
}
上一篇下一篇

猜你喜欢

热点阅读