Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql TIME_WAIT ; problème de trop de connexions

Si un client se connecte à un serveur MySQL, il ouvre généralement un port local, exemple :

 localhost:12345 -> mysqlserver:3306

Si le client ferme la connexion, le client obtient un TIME_WAIT. En raison du routage TCP, un paquet peut arriver en retard sur le port temporaire. Une connexion en TIME_WAIT rejette simplement ces paquets. Sans TIME_WAIT, le port local peut être réutilisé pour une autre connexion et peut recevoir des paquets d'une ancienne connexion.

Sur une application très fréquente sur le Web qui ouvre une connexion mysql par requête, un nombre élevé de connexions TIME_WAIT est prévisible. Il n'y a rien de mal à cela.

Des problèmes peuvent survenir si votre plage de ports locaux est trop faible, vous ne pouvez donc plus ouvrir de connexions sortantes. Le délai d'attente habituel est fixé à 60 secondes. Un problème peut donc déjà survenir sur plus de 400 requêtes par seconde sur des plages basses.

Vérifier :

Pour vérifier le montant de TIME_WAIT, vous pouvez utiliser la commande suivante :

$ 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

La valeur après "tw", dans ce cas 33365, indique la quantité de TIME_WAIT.

Solution :

un. Réglage TIME_WAIT (exemples de systèmes d'exploitation basés sur Linux) :

Réduisez le délai d'attente pour 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

Augmentez la plage de ports pour les ports locaux :

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

Les paramètres /proc/sys/net/ipv4/tcp_tw_recycle et /proc/sys/net/ipv4/tcp_tw_reuse peut être intéressant aussi. (Mais nous avons eu des effets secondaires étranges avec ces paramètres, alors mieux vaut les éviter. Plus d'informations dans ce réponse )

b. Connexions persistantes

Certains langages de programmation et bibliothèques prennent en charge les connexions persistantes. Une autre solution pourrait être d'utiliser un proxy installé localement comme "ProxySQL". Cela réduit le nombre de connexions nouvelles et fermées.