![Mysql innodb_buffer_pool_size 与 innodb_buffer_pool_instances 的关系](https://linux22.com/image/675741/Mysql%20innodb_buffer_pool_size%20%E4%B8%8E%20innodb_buffer_pool_instances%20%E7%9A%84%E5%85%B3%E7%B3%BB.png)
我运行一个虚拟服务器,并在其上安装了 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/