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.
Resposta curta: Não é um problema.
Resposta longa:
O recurso "instâncias" é novo (a partir da versão 5.5.4) e existe para acelerar certas coisas quando o sistema está funcionando com carga de pico. Mas mesmo assim, não ajuda o desempenho mais do que alguns por cento. Para servidores com pouca carga, a melhoria provavelmente não é mensurável.
E o "8"? Ainda não ouvi falar de alguém com problemas quando cada instância tem menos de 1 GB. Suspeito que seja um "conselho", não "uma regra rígida e rápida" para tornar cada instância de pelo menos 1 GB. Na verdade, olhando para algumas dezenas de servidores, vejo que quase metade deles viola isso. Vejo uma máquina com 10 instâncias por apenas 2 GB de buffer_pool.
Eu confiaria no RDS para fornecer configurações razoáveis. Se suas configurações forem ruins, elas serão ruins para todos os seus clientes. Imagine o quanto o RDS incomodaria!