sql >> Database >  >> RDS >> Mysql

mysql TIME_WAIT; te veel verbindingen probleem

Als een client verbinding maakt met een MySQL-server, opent deze meestal een lokale poort, bijvoorbeeld:

 localhost:12345 -> mysqlserver:3306

Als de client de verbinding verbreekt, krijgt de client een TIME_WAIT. Vanwege TCP-routering kan een pakket te laat aankomen op de tijdelijke poort. Een verbinding in TIME_WAIT verwijdert deze pakketten gewoon. Zonder TIME_WAIT wordt de lokale poort mogelijk opnieuw gebruikt voor een andere verbinding en ontvangt hij mogelijk pakketten van een eerdere verbinding.

Op een hoogfrequente applicatie op het web die per verzoek een mysql-verbinding opent, is een groot aantal TIME_WAIT-verbindingen te verwachten. Er is niets mis mee.

Er kunnen problemen optreden als uw lokale poortbereik te laag is, zodat u geen uitgaande verbindingen meer kunt openen. De gebruikelijke time-out is ingesteld op 60 seconden. Er kan dus al een probleem optreden bij meer dan 400 verzoeken per seconde op lage bereiken.

Controleer:

Om de hoeveelheid TIME_WAIT te controleren, kunt u de volgende opdracht gebruiken:

$ 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

De waarde na "tw", in dit geval 33365, geeft de hoeveelheid TIME_WAIT weer.

Oplossingen:

a. TIME_WAIT tuning (Linux-gebaseerde OS-voorbeelden):

Verkort de time-out voor 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

Vergroot het poortbereik voor lokale poorten:

# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range

De instellingen /proc/sys/net/ipv4/tcp_tw_recycle en /proc/sys/net/ipv4/tcp_tw_reuse misschien ook interessant. (Maar we ondervonden vreemde bijwerkingen met deze instellingen, dus vermijd ze beter. Meer informatie in deze antwoord )

b. Aanhoudende verbindingen

Sommige programmeertalen en bibliotheken ondersteunen permanente verbindingen. Een andere oplossing is mogelijk het gebruik van een lokaal geïnstalleerde proxy zoals "ProxySQL". Dit vermindert het aantal nieuwe en gesloten verbindingen.



  1. MySQL FIND_IN_SET() werkt niet zoals verwacht

  2. Kan op afstand verbinding worden gemaakt met SQL Server Express LocalDB?

  3. SQL Cross Join

  4. OdbcConnection retourneert Chinese karakters als ?