理解INNODB缓冲池统计信息


20

阅读完mysql文档中的此页后,我试图弄清当前InnoDB的用法。目前,我们为缓冲池分配了6GB的RAM。我们的数据库大小大致相同。这是show engine innodb status\G(我们正在运行v5.5)的输出

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]

我想知道我们利用缓冲区高速缓存的程度。最初浏览输出后,似乎我们确实在使用它,它基于Pages made youngnot young在其中有数字,并且Buffer pool hit rate is 1000 / 10000(我在网络上的其他地方看到这意味着它的使用率很高。是吗?)

使我陷入困境的原因是,为什么young-making rateand和not都为0/1000,而young/sand non-young/s访问都都为0。所有这些都表明它根本没有被使用,对吗?

任何人都可以帮助理解这一点吗?

Answers:


18
 Buffer pool hit rate is 1000 / 1000

这是您所处的情况中唯一真正有意义的值。该情况是您很幸运能够拥有一个命中率达到100%的缓冲池。请勿过度分析其余内容,因为您无需更改任何内容,除非服务器操作系统的内存不足,从而导致交换。

在缓冲池的压力为零的情况下,年轻/不年轻的值并不有趣。InnoDB正在使用它,没有它,它不会做任何事情。如果池太小,则会逐出页面,会读入新页面,其他统计信息可帮助您了解...但是这是您似乎没有的问题。

如果出于任何原因需要,InnoDB 将永远不会忽略池中的空闲“未使用”空间,也不会使其闲置,因此,空闲的事实意味着您只有一定的喘息空间才能随着工作量的增加而扩展。数据集不断增长。

这就是全部,除非,当然,除非您最近重新启动了服务器(在这种情况下,它是不完整的。)。在统计数据说明整个情况之前,服务器需要运行一整段“正常”使用情况(包括完整备份) ...是一个小时,一天,一周,一个月或一年,取决于您的应用程序。


28

The Buffer pool size 393215 这是页数而不是字节数。

要查看以GB为单位的缓冲池大小,请运行以下命令:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Database pages 360515 这是缓冲池中包含数据的页面数

要查看以GB为单位的缓冲池大小中的数据量,请运行以下命令:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

要查看正在使用的缓冲池的百分比,请运行以下命令:

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Modified db pages 300这是缓冲池中必须写回到数据库的页面数。它们也称为脏页。

要查看脏页面占用的空间,请运行以下命令:

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

要查看脏页面的百分比,请运行以下命令:

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

至于显示的其他内容,请运行以下命令:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

您将看到缓冲池的所有状态变量。您可以对需要检查的内容应用相同的查询。


谢谢!因此,我从中收集到确实确实在使用我们的缓冲区高速缓存,但是我想知道的是我们是否正在有效地使用它。如果我了解年轻页面和旧页面的概念,那么我的猜测是,可以充分利用缓冲区高速缓存来指示年轻页面的数量和对年轻页面的访问,对吗?我们使用mysqldump每3小时进行一次备份,这将解释为什么它已满。但是通过young-making rate 0 / 10000.00 youngs/s,可以告诉我们我们并没有真正利用它。我读对了吗?
萨法多2014年

2
生成率0/1000告诉您正在运行的查询的数据页不仅完全适合高速缓存,而且适合较小(3/8)的年轻高速缓存大小。也就是说,查询没有使用足够的数据来将某些页面老化到大型的年轻缓存中。
Thomas Jones-Low

关于剩余的innodb_buffer_pool状态变量的简短说明将非常有用。您能将其添加到您的答案中

5

我不同意“您很幸运能够拥有一个命中率达到100%的缓冲池”的评估,我对此表示反对。

在输出(被切掉)的顶部,有一行类似于:

Per second averages calculated from the last 16 seconds

这对我来说,在过去的16秒钟内没有任何读取,因此(人工地)为您提供了完美的“ 1000/1000”得分。

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

同时有一些文章。这些可能是为刷新“脏”页面或从“更改缓冲区”清除索引而推迟的写操作。

在过去的16秒钟内,年轻人/炎热区域也可能没有活动。


好吧,我们平均每秒进行6k-10k SELECT,并且同时我可以看到服务器上的磁盘读取活动几乎为0,所以我不认为是这种情况
Safado

“查询缓存”是否满足大多数查询? SHOW VARIABLES LIKE 'query%';SHOW GLOBAL STATUS LIKE 'Qc%';SHOW GLOBAL VARIABLES LIKE 'Com_SELECT';
瑞克·詹姆斯

0

缓冲池分为两个部分:年轻列表和非年轻列表。生成率显示两个列表之间的缓冲池中有多少页被重新排列。

使年轻的页面不是正在创建的年轻页面(即,从缓存中读取。由于不年轻的页面是太旧的页面或年轻列表已满,所以将它们从年轻列表中移出的页面。

页面的速率在这两者之间移动取决于当前正在使用多少缓冲池以及年轻池的大小。设置为零表示您的活动集(正在使用的页面)小于年轻池。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.