我一直在研究这个主题关于Innodb_buffer_pool_pages_free是否可以为0并且仍然对站点没有影响。一些数据库管理员认为 Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total x 100 应该为 5% 或更多,而其他人则认为它可以为 0,因为数据库通常会使用所有缓冲池大小,当它变为 0 时,LRU 页将被驱逐,那也同样快。
我们假设其他指标都不错,例如缓冲池命中率接近 100%,Innodb_buffer_pool_pages_flushed 和 Innodb_buffer_pool_pages_dirty 较低。
Innodb_buffer_pool_pages_free可以是0还是1吗?
在我的网站上,Innodb_buffer_pool_pages_free 每天迅速下降 0.5%。目前,Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total x 100 的比率为 8.65%,并且正在下降。缓冲池的总大小为 96GB。站点工作正常,但我担心随着站点的增长,当 Innodb_buffer_pool_pages_free 最终变为 0 时会发生什么。
听起来不错。
我调查了很多电脑;9% 有
Innodb_buffer_pool_pages_free = 0
. 有一些值很小(包括“1”);少数人拥有数百万美元。具有较小值的机器可能正忙于将数据刷新到磁盘。价值
innodb_buffer_pool_size
是96G?你有 128GB RAM 吗?这是一个很好的设置。您是否有大表和针对它们的长查询?也许我们可以改进索引或其他东西。
至于
Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total
——我的调查中大部分都在1%以下;有几个超过99%。如果大于 15%,我建议进行调查。Innodb_buffer_pool_pages_free * 16384 / innodb_buffer_pool_size
应保持在 70% 以下。(我已经看到它超过 100%,但这似乎“不可能”。)(假设页面大小为 16KB。)我还检查了 的大部分变更日志和发行说明
Innodb_buffer_pool_pages_free
,但什么也没找到。我怀疑这是否会打扰任何人。当
Innodb_buffer_pool_pages_free
=0时,innodb需要读取尚未存在的页面,它会逐出最近最少使用的内存页面并将其用于读取。因此,如果很快就不需要被逐出的页面,这实际上只会带来不便,因为那时它将引发磁盘读取。所以缓冲池是一个缓存,满了并不重要,重要的是它被以高缓存命中率使用。innodb_buffer_pool_reads(磁盘读取)与innodb_buffer_pool_read_requests(内存)是衡量缓存未命中率的一个很好的指标(因此在大多数情况下启动后应该<%1),以确保用户常用的页面在大多数情况下都位于内存中。
(注意innodb_buffer_pool_read_requests最近在 10.11.6(及以上版本)中被破坏,但将在 10.11.7 的下一个版本中修复)。