原理介绍
高吞吐量下,可观察到MySQL中Buf_fetch_normal::get引起的rw_lock_s_lock_func热点,关键调用路径为buf_page_get_gen->Buf_fetch::single_page->Buf_fetch_normal::get。Buf_fetch_normal::get的功能,是获取目标数据页的位于buffer pool中的数据块指针,即通过(space_id,page_no)查询获得buf_block_t*,从而读写页内容。这个映射关系由一个hash表维护,称为page_hash,由hash_table_locks保护。rw_lock_s_lock_func热点即来自该hash_table_locks的加读锁操作。
将竞争激烈的锁对象进行分片,是常见的优化手段。MySQL源码中,已经通过分片来优化hash_table_locks,分片数量由srv_n_page_hash_locks控制,硬编码为16。
图1 hash_table_locks优化前后对比

父主题: hash_table_locks优化