Wenn sich ein Client mit einem MySQL-Server verbindet, öffnet er normalerweise einen lokalen Port, Beispiel:
localhost:12345 -> mysqlserver:3306
Wenn der Client die Verbindung schließt, erhält der Client ein TIME_WAIT. Aufgrund des TCP-Routings kann ein Paket zu spät am temporären Port ankommen. Eine Verbindung in TIME_WAIT verwirft diese Pakete einfach. Ohne TIME_WAIT wird der lokale Port möglicherweise für eine andere Verbindung wiederverwendet und empfängt möglicherweise Pakete von einer früheren Verbindung.
Bei einer hochfrequenten Anwendung im Web, die per Anfrage eine mysql-Verbindung öffnet, ist mit einer hohen Anzahl von TIME_WAIT Verbindungen zu rechnen. Daran ist nichts auszusetzen.
Probleme können auftreten, wenn Ihr lokaler Portbereich zu niedrig ist, sodass Sie keine ausgehenden Verbindungen mehr öffnen können. Das übliche Timeout ist auf 60 Sekunden eingestellt. Bei niedrigen Reichweiten kann es also schon bei mehr als 400 Anfragen pro Sekunde zu einem Problem kommen.
Überprüfen:
Um die Menge an TIME_WAIT zu überprüfen, können Sie den folgenden Befehl verwenden:
$ 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
Der Wert nach "tw", in diesem Fall 33365, zeigt die Dauer von TIME_WAIT.
Lösungen:
a. TIME_WAIT-Tuning (Beispiele für Linux-basierte Betriebssysteme):
Reduzieren Sie das Zeitlimit 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
Erhöhen Sie den Portbereich für lokale Ports:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Die Einstellungen /proc/sys/net/ipv4/tcp_tw_recycle
und /proc/sys/net/ipv4/tcp_tw_reuse
könnte auch interessant sein. (Aber wir haben seltsame Nebeneffekte mit diesen Einstellungen erlebt, also vermeiden Sie sie besser. Weitere Informationen in diesem Antwort
)
b. Dauerhafte Verbindungen
Einige Programmiersprachen und Bibliotheken unterstützen dauerhafte Verbindungen. Eine andere Lösung könnte die Verwendung eines lokal installierten Proxys wie „ProxySQL“ sein. Dies reduziert die Anzahl neuer und geschlossener Verbindungen.