将 innodb_buffer_pool_instances 设置为大于 CPU 数量是一种浪费吗?

Jef*_*man 6 mysql innodb mysql-5.5 buffer-pool

innodb_buffer_pool_size在具有 12 个 CPU 内核的服务器上将其设置为 20GB。我的完整数据库是 11gb,但其中大部分是几乎从未使用过的存档表。总查询数据约为 3 gb,频繁查询的数据约为 1.25 gb。

我应该设置什么innodb_buffer_pool_instances

  1. innodb_buffer_pool_size / 总查询数据 = 6 个池实例
  2. innodb_buffer_pool_size / 经常查询的数据 = 16 个池实例

通常我会选择选项 #2,但从逻辑上讲,任何时候可以使用的缓冲池数量似乎不超过 CPU 内核的总数。

设置innodb_buffer_pool_instances为超过 CPU 核数是一种浪费吗?

小智 1

我认为您不需要为查询的数据设置太多的缓冲池,因为频繁查询的数据的大小并不能完全证明它的合理性。这当然取决于“经常”的定义。

您应该参考有关 innodb 缓冲池的页面的相应文档,此处:

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-buffer-pools.html

我在这里关注的数字是

经常查询的数据约为 1.25 GB。

当试图保持 InnoDB 缓冲区正确的大小时,我的经验法则是将它们保持在 1GB 或大约 1GB 一块,为了使块列表尽可能短,但又不让缓冲区列表太牵强,这将但始终取决于您的实际需求。

这符合 MySQL 的建议:

为了获得最佳效率,请指定 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的组合,以便每个缓冲池实例至少为 1 GB。

多个缓冲池的目的是确保您的 CPU 线程在访问数据时不会出现高争用。或者正如他们所说:

您可能会遇到多个线程同时尝试访问缓冲池的瓶颈。您可以启用多个缓冲池来最大限度地减少这种争用。

然而,此功能更适合经常访问的大量数据,而不是系统经常使用的 1.25GB。最终,如果我处在你的位置,我不会认为需要比 CPU 数量更多的缓冲池,假设所有 CPU 都只执行 MySQL 相关任务。我还将研究使用来innodb_old_blocks_time防止偶尔查询归档表来代替反复使用的数据块的影响。

我希望这有帮助,让我知道一切进展如何。