Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql TIME_WAIT; problem ze zbyt wieloma połączeniami

Jeśli klient łączy się z serwerem MySQL, zwykle otwiera port lokalny, na przykład:

 localhost:12345 -> mysqlserver:3306

Jeśli klient zamknie połączenie, klient otrzyma TIME_WAIT. Z powodu routingu TCP pakiet może dotrzeć do portu tymczasowego z opóźnieniem. Połączenie w TIME_WAIT po prostu odrzuca te pakiety. Bez TIME_WAIT port lokalny może zostać ponownie wykorzystany do innego połączenia i może odbierać pakiety z poprzedniego połączenia.

W przypadku często używanej aplikacji w sieci, która otwiera połączenie mysql na żądanie, można spodziewać się dużej liczby połączeń TIME_WAIT. Nie ma w tym nic złego.

Problemy mogą wystąpić, jeśli zakres portów lokalnych jest zbyt niski, więc nie można już otwierać połączeń wychodzących. Zwykły limit czasu jest ustawiony na 60 sekund. Tak więc problem może już wystąpić przy ponad 400 żądaniach na sekundę na niskich zakresach.

Sprawdź:

Aby sprawdzić ilość TIME_WAIT, możesz użyć następującego polecenia:

$ 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

Wartość po „tw”, w tym przypadku 33365, pokazuje ilość TIME_WAIT.

Rozwiązania:

a. Strojenie TIME_WAIT (przykłady systemu operacyjnego Linux):

Skróć czas oczekiwania na 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

Zwiększ zakres portów dla portów lokalnych:

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

Ustawienia /proc/sys/net/ipv4/tcp_tw_recycle i /proc/sys/net/ipv4/tcp_tw_reuse może być również interesujące. (Ale doświadczyliśmy dziwnych skutków ubocznych przy tych ustawieniach, więc lepiej ich unikaj. Więcej informacji w tym odpowiedź )

b. Trwałe połączenia

Niektóre języki programowania i biblioteki obsługują trwałe połączenia. Innym rozwiązaniem może być użycie lokalnie zainstalowanego serwera proxy, takiego jak „ProxySQL”. Zmniejsza to liczbę nowych i zamkniętych połączeń.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj poprzednią wartość po aktualizacji - MySql

  2. Czy mogę wykonać wiele zapytań oddzielonych średnikami za pomocą MySQL Connector/J?

  3. MySQL JOIN zwraca NULL pól

  4. mysql sortowanie numerów wersji

  5. MySQL Tworzenie tabel z kluczami obcymi dając errno:150