Meu palpite é que você tem algumas consultas longas em seu aplicativo. Quando elas são executadas, elas fazem com que a conexão permaneça fora do pool por um longo período (em relação ao padrão de uso usual), o que faz com que o pool se esgote, cresça e continue crescendo até o máximo. quaisquer trabalhadores restantes bloqueiam a espera de conexões para serem liberadas.
A primeira coisa será rastrear quando isso acontecer, isto é, é um evento cíclico ou aleatório. Se é o primeiro você está com sorte, como você pode estar pronto o tempo acontece. Se você não pode determinar um padrão, então você terá que ser vigilante.
Você pode descobrir isso consultando os registros de monitoramento de seu website ou sar
do seu banco de dados para ver se há algum pico de correlação.
Se você pode pegar seu banco de dados quando está sob carga, você deve executar os seguintes comandos no servidor mysql
show innodb status;
show processlist;
O primeiro irá imprimir informações de diagnóstico sobre o mecanismo innodb (você está usando innodb, certo?), este último imprimirá as primeiras centenas de caracteres da consulta que estava sendo executada. Procure por consultas que estão em execução há muito tempo, consultas que geram tabelas temporárias no disco e consultas bloqueadas em um recurso.
Depois disso, o trabalho duro começa. Use EXPLAIN
para estimar o custo da consulta e os recursos que ela usa. Evite consultas que exigem classificação no disco por meio de uma tabela tmp. Procure trabalhos de relatórios de longa duração ou outras tarefas de manutenção agendadas que periodicamente bloqueiam ou saturam seu banco de dados. Pode ser algo tão simples quanto a tarefa de backup ou um trabalho que acumula dados antigos de pedidos de compra.
Eu recomendo ter essas três configurações em /etc/my.cnf
log_slow_queries
log-queries-not-using-indexes
set-variable = long_query_time=1
Para um aplicativo da Web que faz de 20 a 30 solicitações por segundo, você não pode permitir que nada apareça nesses registros.
btw, IMHO é inútil aumentar o tamanho do pool de conexão além do tamanho original, pois isso só atrasará o início do esgotamento da piscina em, no máximo, alguns segundos, e só colocará mais pressão no seu banco de dados quando ele não precisa disso.