Quando o número de conexões de uma instância RDS for MySQL atinge o máximo, todos os clientes — incluindo o Data Management (DMS) e outras ferramentas — recebem a mensagem de erro ERROR 1040 (HY000): Too many connections. Este tópico descreve como diagnosticar a causa raiz e resolver o problema.
Diagnosticar o problema
Execute as consultas a seguir para verificar o status atual das conexões:
-- Check the configured maximum connections
SELECT @@max_connections;
-- Check the number of currently connected clients
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
Se o valor de Threads_connected estiver igual ou próximo de max_connections, as conexões estão esgotadas.
Para identificar se o problema decorre de conexões ociosas ou ativas, acesse a página Monitoring and Alerts no console do ApsaraDB RDS e verifique a métrica Session. Analise o valor de mysql.active_session para comparar a quantidade de sessões ativas e ociosas.
Caso a maioria das sessões esteja ociosa, consulte Resolver problemas causados por excesso de conexões ociosas.
Se a maior parte das sessões estiver ativa, veja Resolver problemas causados por excesso de conexões ativas.
Resolver problemas causados por excesso de conexões ociosas
O MySQL utiliza uma thread por conexão. Mesmo as conexões ociosas mantêm uma thread dedicado no processo do MySQL, o que consome memória e aumenta a sobrecarga de troca de contexto. Um grande volume de conexões ociosas pode esgotar o limite de conexões sem carga de trabalho ativa.
As causas mais comuns para o acúmulo excessivo de conexões ociosas incluem:
Aplicações com conexões persistentes sem pool de conexões: Por exemplo, uma aplicação Java que usa conexões persistentes, mas não possui um pool configurado. Se você especificar um número inicial alto de conexões na inicialização, a aplicação abrirá muitas conexões ociosas com a instância RDS imediatamente.
Aplicações com conexões de curta duração que não fecham as conexões: Como uma aplicação PHP que utiliza conexões temporárias, mas não as fecha explicitamente após a conclusão das consultas.
Etapa 1: Encerrar sessões ociosas imediatamente
Encerre as sessões ociosas usando um dos métodos abaixo:
Console do ApsaraDB RDS: Acesse a página Session e utilize o gerenciamento de sessões para finalizar as ociosas.
DMS: Use o recurso de gerenciamento de sessões do DMS para identificar e encerrar sessões inativas.
CLI do MySQL: Execute o comando
kill <session_id>para terminar uma sessão específica.
Etapa 2: Reduzir o tempo limite de conexão ociosa
A instância RDS encerra automaticamente as conexões ociosas após um período de tempo limite configurado:
|
Parâmetro |
Valor padrão |
Descrição |
|
|
86.400 segundos (24 horas) |
Tempo limite para conexões em modo não interativo |
|
|
7.200 segundos (2 horas) |
Tempo limite para conexões em modo interativo |
Os valores padrão são elevados. Reduzi-los faz com que a instância recupere conexões ociosas mais rapidamente. Para alterar esses parâmetros, acesse a página Parameters no console do ApsaraDB RDS.
As alterações nos parâmetroswait_timeouteinteractive_timeoutaplicam-se apenas a novas conexões estabelecidas após a mudança. As conexões existentes mantêm seus valores originais de tempo limite.
Na maioria dos casos, as aplicações conectam-se às instâncias RDS em modo não interativo. Para determinar o modo de conexão da sua aplicação, verifique a configuração de conexão correspondente. Em aplicações PHP, especifique a constante MYSQL_CLIENT_INTERACTIVE na função mysql_connect() para ativar o modo interativo.
Etapa 3: Corrigir vazamentos de conexão na aplicação
Conexões ociosas frequentemente se acumulam porque a aplicação não as fecha explicitamente após concluir as consultas. Aplicações PHP com conexões de curta duração, por exemplo, às vezes omitem a etapa de fechamento e deixam as conexões abertas até que atinjam o tempo limite.
Revise o código da sua aplicação para garantir o fechamento explícito das conexões após cada consulta ou operação.
Resolver problemas causados por excesso de conexões ativas
Um grande número de conexões ativas geralmente indica um gargalo de desempenho que causa o enfileiramento de consultas. As causas comuns incluem:
Alta utilização de CPU
Consultas lentas
Esperas por locks do InnoDB ou por locks de metadados
Alta utilização de IOPS
Identifique o gargalo subjacente e trate-o diretamente:
Se o problema decorrer de esperas de lock do InnoDB, consulte O que fazer se ocorrerem esperas de lock de linha em uma instância ApsaraDB RDS for MySQL e essas esperas atingirem o tempo limite?
Para problemas decorrentes de esperas por locks de metadados, veja Usar o DMS para liberar locks de metadados.
Quando a causa for alta utilização de CPU, consulte O que fazer se a utilização de CPU de uma instância ApsaraDB RDS for MySQL ou ApsaraDB RDS for MariaDB estiver alta?
Caso o motivo seja o alto uso de IOPS, veja O que fazer se o uso de IOPS de uma instância ApsaraDB RDS for MySQL estiver alto?
Prevenir problemas de limite de conexão
Usar um pool de conexões (recomendado)
Um pool de conexões gerencia um conjunto fixo de conexões persistentes compartilhadas entre a aplicação, em vez de abrir uma nova conexão para cada solicitação. Essa é a solução de longo prazo mais eficaz para evitar o esgotamento de conexões, sendo especialmente importante para aplicações que abrem e fecham grandes quantidades de conexões de curta duração — como funções serverless ou aplicações PHP.
Ao configurar o tamanho máximo do pool, defina um valor menor que o limite de conexões da instância. Reserve pelo menos 10 conexões para o DMS e outras operações de gerenciamento.
Por exemplo, se sua instância suporta 500 conexões, configure o máximo do pool de conexões como 490.
Ativar detecção e reutilização de conexões
Ative a detecção de conexões no seu pool para remover automaticamente as obsoletas. Habilite também o recurso de reutilização para que o pool aproveite as conexões existentes em vez de abrir novas desnecessariamente.
Aumentar o tipo da instância
Se a demanda por conexões exceder consistentemente o limite atual, faça upgrade para um tipo de instância maior que suporte mais conexões.