Mysql innodb_buffer_pool_size 与 innodb_buffer_pool_instances 的关系

Mysql innodb_buffer_pool_size 与 innodb_buffer_pool_instances 的关系

我运行一个虚拟服务器,并在其上安装了 Owncloud。现在 Owncloud 存在一个问题,即它目前的开发方式会导致每次文件上传都会产生少量 MySql 开销。

因此,尽可能地优化 MySql 数据库非常重要。网上有很多人推荐使用非常大的内存,innodb_buffer_pool_size最高可达 4、5 或更多 GB,是的,有些人甚至说最高可达总内存的 70% 到 80%,嗯?

嗯,但是很少有人介意第二个参数innodb_buffer_pool_instances

那么让我们看看我的情况。我的虚拟机资源有限。这意味着总内存为 6400 GByte,正常模式下约为 3000 GByte(由 libvirt 处理)。因此,如果我将其设置innodb_buffer_pool_instances为大于 1 或将其设置为较新的 MySql 服务器(8 或类似服务器)的默认配置,则意味着(只要我理解正确)在最坏的情况下,例如innodb_buffer_pool_instances = 4= innodb_buffer_pool_size = 4> 4*4 = 16 GByte 内存使用率在最大情况下。这会导致交换磁盘使用不良,并且 MySql innodb 缓冲区的每次交换使用都会对任何性能造成过度影响。

结论很简单。可用的缓冲区大小必须至少小于可用 RAM 的 70% 左右,其余部分可能是 php、apache 和系统本身所需的。

那么什么才是更好的决定呢?只有一个可能, innodb_buffer_pool_instances但非常大,innodb_buffer_pool_size或者更好的是更小innodb_buffer_pool_size,因此innodb_buffer_pool_instances如果需要的话可以同时使用更多。

我的服务器最多有 10 到 30 人使用。

答案1

innodb_buffer_pool_instances(innodb_buffer_pool_instances):

除非是几 GB,否则看不到它的效果innodb_buffer_pool_size,将缓冲池分成单独的实例可以提高效率。这也是一种调优做法,以便innodb_buffer_pool_instance每个缓冲池实例至少为 1GB。

例如,如果 innodb_buffer_pool_size = 4GB,那么 innodb_buffer_pool_instances = 4

MySQL 5.6 默认值为 8


innodb_buffer_pool_size:这个参数表示数据库缓冲池的大小。

innodb_buffer_pool_size 应为 RAM 的 80%

这个想法仅适用于没有其他进程运行的专用 MySQL 服务器。另一方面,缓冲池不应太小,并且是否有足够的 RAM。此外,需要检查系统是否是 64/32 位。

答案2

我认为此方面的最佳做法在链接中非常清楚: https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_buffer_pool_instances

如果 innodb_buffer_pool_size 值是 GB 的倍数,我们可以将 innodb_buffer_pool_instances 增加为一个数字,以便每个实例至少有 1 GB。对于运行 mysql 的专用系统,也可以根据可用的系统 RAM 设置 innodb_buffer_pool_size。它可能不完全遵循 70-80% 的经验法则。我根据系统 RAM 研究了最佳值,并构建了一个计算器来计算 innod_db_buffer_pool_size,该计算器可作为博客文章的一部分提供:https://scalegrid.io/blog/calculating-innodb-buffer-pool-size-for-your-mysql-server/

相关内容