Om en klient ansluter till en MySQL-server, öppnar den vanligtvis en lokal port, till exempel:
localhost:12345 -> mysqlserver:3306
Om klienten stänger anslutningen får klienten en TIME_WAIT. På grund av TCP-routing kan ett paket komma sent till den tillfälliga porten. En anslutning i TIME_WAIT kasserar bara dessa paket. Utan en TIME_WAIT kan den lokala porten återanvändas för en annan anslutning och kan ta emot paket från en tidigare anslutning.
På en mycket frekvent applikation på webben som öppnar en mysql-anslutning per förfrågan kan man förvänta sig ett stort antal TIME_WAIT-anslutningar. Det är inget fel med det.
Problem kan uppstå om ditt lokala portintervall är för lågt, så att du inte kan öppna utgående anslutningar längre. Den vanliga timeouten är inställd på 60 sekunder. Så ett problem kan redan uppstå på mer än 400 förfrågningar per sekund på låga intervall.
Kontrollera:
För att kontrollera mängden TIME_WAIT kan du använda följande kommando:
$ 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
Värdet efter "tw", i detta fall 33365, visar mängden TIME_WAIT.
Lösningar:
a. TIME_WAIT-inställning (Linux-baserade OS-exempel):
Minska timeouten för 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
Öka portintervallet för lokala portar:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Inställningarna /proc/sys/net/ipv4/tcp_tw_recycle
och /proc/sys/net/ipv4/tcp_tw_reuse
kan vara intressant också. (Men vi upplevde konstiga biverkningar med dessa inställningar, så det är bäst att undvika dem. Mer information i denna svar
)
b. Beständiga anslutningar
Vissa programmeringsspråk och bibliotek stöder beständiga anslutningar. En annan lösning kan vara att använda en lokalt installerad proxy som "ProxySQL". Detta minskar antalet nya och stängda anslutningar.