Pokud se klient připojí k serveru MySQL, obvykle otevře místní port, příklad:
localhost:12345 -> mysqlserver:3306
Pokud klient uzavře připojení, klient obdrží TIME_WAIT. Kvůli směrování TCP může paket dorazit na dočasný port pozdě. Připojení za TIME_WAIT tyto pakety pouze zahodí. Bez TIME_WAIT může být místní port znovu použit pro další připojení a může přijímat pakety z předchozího připojení.
U vysoce frekventované aplikace na webu, která otevírá připojení mysql na požadavek, lze očekávat velké množství připojení TIME_WAIT. Není na tom nic špatného.
Problémy mohou nastat, pokud je rozsah vašeho místního portu příliš nízký, takže již nemůžete otevřít odchozí připojení. Obvyklý časový limit je nastaven na 60 sekund. Problém tedy může nastat již u více než 400 požadavků za sekundu na nízkých rozsazích.
Zkontrolujte:
Chcete-li zkontrolovat množství TIME_WAIT, můžete použít následující příkaz:
$ 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
Hodnota za „tw“, v tomto případě 33365, ukazuje množství TIME_WAIT.
Řešení:
A. Ladění TIME_WAIT (příklady operačního systému založeného na Linuxu):
Zkraťte časový limit pro 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
Zvětšete rozsah portů pro místní porty:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Nastavení /proc/sys/net/ipv4/tcp_tw_recycle
a /proc/sys/net/ipv4/tcp_tw_reuse
může být také zajímavé. (Ale s těmito nastaveními jsme zaznamenali podivné vedlejší účinky, takže se jim raději vyhněte. Více informací v tomto odpověď
)
b. Trvalá připojení
Některé programovací jazyky a knihovny podporují trvalá připojení. Dalším řešením může být použití lokálně nainstalovaného proxy, jako je „ProxySQL“. To snižuje množství nových a uzavřených připojení.