sql >> Database teknologi >  >> RDS >> Mysql

mysql TIME_WAIT; for mange forbindelser problem

Hvis en klient opretter forbindelse til en MySQL-server, åbner den normalt en lokal port, f.eks.:

 localhost:12345 -> mysqlserver:3306

Hvis klienten lukker forbindelsen, får klienten en TIME_WAIT. På grund af TCP-routing kan en pakke ankomme for sent på den midlertidige port. En forbindelse i TIME_WAIT kasserer bare disse pakker. Uden en TIME_WAIT kan den lokale port muligvis genbruges til en anden forbindelse og modtage pakker fra en tidligere forbindelse.

På en højfrekvent applikation på nettet, som åbner en mysql-forbindelse pr. anmodning, forventes et højt antal TIME_WAIT-forbindelser. Der er ikke noget galt med det.

Der kan opstå problemer, hvis dit lokale portområde er for lavt, så du ikke længere kan åbne udgående forbindelser. Den sædvanlige timeout er indstillet til 60 sekunder. Så et problem kan allerede opstå ved mere end 400 anmodninger i sekundet på lave områder.

Tjek:

For at kontrollere mængden af ​​TIME_WAIT kan du bruge følgende 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ærdien efter "tw", i dette tilfælde 33365, viser mængden af ​​TIME_WAIT.

Løsninger:

en. TIME_WAIT tuning (Linux-baserede OS-eksempler):

Reducer timeout for 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

Forøg portområdet for lokale porte:

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

Indstillingerne /proc/sys/net/ipv4/tcp_tw_recycle og /proc/sys/net/ipv4/tcp_tw_reuse kunne også være interessant. (Men vi oplevede mærkelige bivirkninger med disse indstillinger, så det er bedst at undgå dem. Flere oplysninger i denne svar )

b. Vedvarende forbindelser

Nogle programmeringssprog og biblioteker understøtter vedvarende forbindelser. En anden løsning kan være at bruge en lokalt installeret proxy som "ProxySQL". Dette reducerer antallet af nye og lukkede forbindelser.



  1. Python pandas to_sql 'tilføj'

  2. SQL - Vælg rækker fra to forskellige tabeller

  3. Er det muligt at bruge Crosstab/Pivot Query i MySQL?

  4. Returner id, hvis der findes en række, INSERT ellers