Eu tenho um banco de dados RDS de mestre único provisionado (5.6.mysql_aurora.1.23.0) com um gravador e um leitor. Os clientes são um monte de aplicativos jetty com um pool de até 250 conexões cada.
Há algum tempo venho lutando com problemas intermitentes: as tentativas de conexão começam a expirar, principalmente. Parece correlacionar-se com cargas altas, e comecei a copiar o todo information_schema.processlist
para uma tabela de log em intervalos regulares (com um carimbo de data/hora, obviamente), e parece que o problema se torna mais pronunciado quando o número de conexões atinge 2000. Nunca chega perto max_connections
ou max_user_connections
:
mysql> show variables like "%max%conn%";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| aurora_max_connections_limit | 16000 |
| max_connect_errors | 100 |
| max_connections | 3000 |
| max_user_connections | 0 |
+------------------------------+-------+
4 rows in set (0.03 sec)
Então, em quais parâmetros devo me concentrar para superar esse problema? Não encontrei nada provável, isso explica por que 2000 conexões parecem causar isso; é claro, pode ser simplesmente uma coincidência que um número tão redondo apareça.
Isso provavelmente será o resultado do esgotamento da memória. Cada conexão com o banco de dados requer um pouco de memória e, se cada conexão precisar de 1 MB (um número baixo), você pode estar olhando para cerca de 2 GB de memória usada apenas para as conexões.
Esta consulta SQL permitirá que você saiba a quantidade máxima de memória que qualquer conexão única pode usar:
Verifique se esse número não é muito alto (que é um número subjetivo com base na experiência com seus bancos de dados especÃficos). Se o banco de dados estiver com a memória esgotada regularmente, talvez você precise de uma instância com otimização de memória ou de limites mais rÃgidos sobre quantos recursos cada conexão pode consumir.