澄清一下innodb buffer pool 缓存命中率(cache hit ratio)指标的计算,这个计算涉及到两个状态变量innodb_buffer_pool_reads和innodb_buffer_pool_read_requests。官方文档对这两个变量的解释如下:
The number of logical reads that
InnoDB
could not satisfy from the
buffer pool
, and had to read directly from disk.
Innodb_buffer_pool_read_requests
The number of logical read requests.
从上面的解释来并不能看出来这两个变量之间有什么关系。需要从代码上去分析一下。我简单的翻了代码,不求十分准确,只要能解释其中的关系就好。
innodb_buffer_pool_reads和innodb_buffer_pool_read_requests的定义可以在下面找到,
// 下面的代码出现在ha_innodb.cc文件中的大概967-970行
(char *)&export_vars.innodb_buffer_pool_read_requests, SHOW_LONG,
SHOW_SCOPE_GLOBAL},
{"buffer_pool_reads", (char *)&export_vars.innodb_buffer_pool_reads,
SHOW_LONG, SHOW_SCOPE_GLOBAL},
可以看到,在代码中innodb_buffer_pool_reads使用了(char *)&export_vars.innodb_buffer_pool_reads来指代;innodb_buffer_pool_read_requests使用(char *)&export_vars.innodb_buffer_pool_read_requests来指代。两个都是字符指针。
进一步的,这两个指代变量在这里赋值,
//下面这行代码出现在srv0srv.cc文件大概1524-1525行的位置
export_vars.innodb_buffer_pool_read_requests =
Counter::total(stat.m_n_page_gets);
//下面这行代码出现在srv0srv.cc文件大概1534行的位置
export_vars.innodb_buffer_pool_reads = srv_stats.buf_pool_reads;
可以看到export_vars.innodb_buffer_pool_read_requests使用了stat.m_n_page_gets并对其求和来计算(是因为其中分了若干个shards,累积的时候,根据shard分别累积,取值的时候,需要求和);export_vars.innodb_buffer_pool_reads使用了srv_stats.buf_pool_reads来计算。
下面进一步看srv_stats.buf_pool_reads、stat.m_n_page_gets这两个变量实际发生变化的地方,因为代码中对这两个变量的计算在多处都有发生,这里只各取一处,能说明其中的关系就好:
//buf0buf.cc
template