我们有一个 MySQL 5.7 AWS RDS 实例在 db.m4.large 实例上运行。该实例类型的基本资源是:
- 7.5GB 内存
- 2个虚拟CPU
RDS 默认为将 75% 的 RAM 分配给 innodb_buffer_pool_size 的计算。
{DBInstanceClassMemory*3/4}
这最终是一个 6GB 的分配:
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 6.000000000000 |
+------------------------------------------+
在 MySQL 5.7 中,如果您不设置缓冲池实例的数量,那么MySQL 现在默认为 8 个池。但是MySQL 5.7 手册在讨论缓冲池实例时指出了这一点:
您指定的总大小在所有缓冲池中分配。为了获得最佳效率,请指定 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的组合,以便每个缓冲池实例至少为 1GB。
出于这个原因,我计划将 innodb_buffer_pool_instances 减少到 <= 6。
以下是我的问题:
- CPU 的数量和 buffer_pool_instances 设置之间是否存在某种关联?
- 在这种情况下,使用 4,5 或 6 个 buffer_pool_instances 会更好吗?如果是这样,该建议背后的原因是什么?我的简单反应是将设置更改为 6 个缓冲池实例以满足“至少 1GB”的建议,但我很想听听任何进一步研究过此设置或对此设置进行基准测试的人的意见RDS 与否。
简短的回答:没问题。
长答案:
“实例”功能是新的(从 5.5.4 开始),它的存在是为了在系统以峰值负载运行时加速某些事情。但即便如此,它对性能的帮助也不会超过几个百分点。对于负载较轻的服务器,改进可能无法衡量。
“8”呢?我还没有听说有人在每个实例小于 1GB 时遇到麻烦。我怀疑让每个实例至少有 1GB 是“建议”,而不是“硬性规定”。事实上,看了几十台服务器,我发现其中几乎有一半违反了这一点。我看到一台机器有 10 个实例,只有 2GB 的 buffer_pool。
我相信 RDS 会提供合理的设置。如果他们的设置不好,他们将对所有客户都不利。想象一下 RDS 会有多少麻烦!