Temos uma instância MySQL 5.7 AWS RDS em execução em uma instância db.m4.large. Os recursos básicos para esse tipo de instância são:
- 7,5 GB de RAM
- 2 VCPUs
O padrão do RDS é um cálculo que aloca 75% da RAM para innodb_buffer_pool_size.
{DBInstanceClassMemory*3/4}
Isso acaba sendo uma alocação de 6 GB:
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 6.000000000000 |
+------------------------------------------+
Com o MySQL 5.7, se você não definir o número de instâncias do pool de buffers, o MySQL agora assume como padrão 8 pools . No entanto, o manual do MySQL 5.7 afirma isso ao discutir instâncias de buffer pool:
O tamanho total especificado é dividido entre todos os conjuntos de buffers. Para melhor eficiência, especifique uma combinação de innodb_buffer_pool_instances e innodb_buffer_pool_size para que cada instância do conjunto de buffers tenha pelo menos 1 GB.
Por esse motivo, pretendo reduzir o innodb_buffer_pool_instances para um número <= 6.
Aqui estão minhas perguntas:
- Existe alguma correlação a ser feita entre o número de CPUs e a configuração buffer_pool_instances?
- Seria melhor neste cenário ir com 4,5 ou 6 buffer_pool_instances e, em caso afirmativo, qual é o raciocínio por trás dessa recomendação? Minha resposta simplista seria alterar a configuração para 6 instâncias de buffer pool para satisfazer a recomendação de "pelo menos 1 GB", mas eu estaria interessado em ouvir de qualquer pessoa que tenha analisado isso mais a fundo ou feito benchmarking dessa configuração, seja sob RDS ou não.