innodb_buffer_pool_reads、innodb_buffer_pool_read_requests分析与innodb 缓存命中率计算

  • Post author:
  • Post category:其他


澄清一下innodb buffer pool  缓存命中率(cache hit ratio)指标的计算,这个计算涉及到两个状态变量innodb_buffer_pool_reads和innodb_buffer_pool_read_requests。官方文档对这两个变量的解释如下:



Innodb_buffer_pool_reads




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



版权声明:本文为w1346561235原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。