Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql TIME_WAIT; problema de muitas conexões


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.