Se um cliente se conecta a um MySQL-Server, geralmente abre uma porta local, exemplo:
localhost:12345 -> mysqlserver:3306
Se o cliente fechar a conexão, o cliente receberá um TIME_WAIT. Devido ao roteamento TCP, um pacote pode chegar atrasado na porta temporária. Uma conexão em TIME_WAIT apenas descarta esses pacotes. Sem um TIME_WAIT, a porta local pode ser reutilizada para outra conexão e pode receber pacotes de uma conexão anterior.
Em um aplicativo de alta frequência na web que abre uma conexão mysql por solicitação, uma grande quantidade de conexões TIME_WAIT é esperada. Não há nada de errado com isso.
Podem ocorrer problemas se o intervalo de portas locais for muito baixo, de modo que você não poderá mais abrir conexões de saída. O tempo limite normal é definido para 60 segundos. Portanto, um problema já pode ocorrer em mais de 400 solicitações por segundo em intervalos baixos.
Verificar:
Para verificar a quantidade de TIME_WAIT, você pode usar o seguinte comando:
$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
O valor após "tw", neste caso 33365, mostra a quantidade de TIME_WAIT.
Soluções:
uma. Ajuste de TIME_WAIT (exemplos de SO baseados em Linux):
Reduza o tempo limite para TIME_WAIT:
# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
Aumente o intervalo de portas para portas locais:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
As configurações
/proc/sys/net/ipv4/tcp_tw_recycle
e /proc/sys/net/ipv4/tcp_tw_reuse
pode ser interessante também. (Mas experimentamos efeitos colaterais estranhos com essas configurações, então é melhor evitá-los. Mais informações neste resposta
) b. Conexões Persistentes
Algumas linguagens de programação e bibliotecas suportam conexões persistentes. Outra solução pode estar usando um proxy instalado localmente como "ProxySQL". Isso reduz a quantidade de conexões novas e fechadas.