标题可能有点误导,因为我完全了解 innodb 缓冲池的概念,但想了解有关它的计算过程的一些具体信息。
根据 mysql 文档:
在专用数据库服务器上,您可以将缓冲池大小设置为机器物理内存大小的 80%。
现在,当我们谈论实际数字时,百分比方法在这里有何意义?
比方说,目前我的数据库使用 80 GB 的 RAM,而 20 GB 的 RAM 留给其他任务使用。一段时间后,我的数据库变大了,我决定增加缓冲池的大小。为了保持 80% 的比例,我必须增加服务器的总内存,即使其他进程不需要更多内存。为什么不在为其他任务保留相同的 20gb ram 的同时添加额外的 ram?
80% 只是帮助人们从比默认值更合理的值开始的一般经验法则。
缓冲池大小的计算实际上可能更复杂。理想情况下,经常访问的数据页应该保留在缓冲池中,并且您不希望因为它对性能的影响而发生太多驱逐。这同样是通用的,但更现实的衡量标准是让缓冲池足够大以容纳热数据 + 足够的空间以避免不频繁的读取触发过多的驱逐。
仅仅因为您有一个 1TB 大的数据库,如果您一直只读取相同的 100MB,那么您就不必拥有 1Tb 的缓冲池。
还要记住,插入和更新也会影响缓冲池的使用,因为操作发生在那里。您应该尝试匹配您可以写入 innodb 日志的数据量(由 控制
innodb_log_file_size
)和缓冲池中为此所需的空间。即使您有很大的 innodb 日志文件,但没有足够的空间用于插入,驱逐也会导致将数据页刷新到表空间,这在本质上与检查点具有相同的效果。正确调整缓冲池大小的一种经验方法是设置与数据大小一样高(或尽可能大)并在其上运行正常生产负载,同时不断减小大小,同时测量事务率、响应时间和
threads_running
. 当您看到性能开始下降时,这至少是您需要的大小。我更喜欢说“可用RAM 的 70%”。所以,70% * (80-20) = 56。但是,实际上,很难预测 mysqld 将使用多少“其他”内存。
从另一边看,buffer_pool 不需要比所有 Data_length + Index_length 的总和多很多,从
SHOW TABLE STATUS
.这是一个更长的讨论。
最终目标是将整个数据库保存在内存中以提高性能。但是,实际上并不总是可能的。例如,考虑 2 TB 的数据库大小。在这种情况下,由于资源限制,我们无法分配 2 TB RAM。所以我们应该尽量在内存中至少保留工作数据集。识别实际工作集数据是一个非常复杂的过程,所以我们应该尽量设置最大可能值。所以,这里总可用内存的 80% 将是一个不错的选择。因为我们也需要其他进程的内存。
当您将整个内存分配给 InnoDB 缓冲池时,其他进程会竞争内存。这将导致交换。
Swapping
在数据库服务器中是最糟糕的。innodb_buffer_pool_size
因此,您必须根据要求从变量的较小值开始到较高值。要回答您的问题,当您知道数据库大小在增长时,只需从总可用 RAM 的 80% 开始并开始监视您的 InnoDB 内存状态。如果 MySQL 使用了 95% 以上
InnoDB buffer pool
,那么你应该考虑增加innodb_buffer_pool_size.
一些有用的命令来做到这一点:还有一个:
找到
Free Buffers
和部分Buffer Pool hit ratio
。查看此页面以了解 InnoDB 缓冲池、相关变量以及如何为 InnoDB 缓冲池分配内存。BUFFER POOL AND MEMORY
为其他进程保留 20% 的剩余内存是安全的,以避免在最坏的情况下发生交换。我希望这能帮到您!。