Ако клиент се свърже с MySQL-сървър, той обикновено отваря локален порт, например:
localhost:12345 -> mysqlserver:3306
Ако клиентът затвори връзката, клиентът получава TIME_WAIT. Поради TCP маршрутизиране, пакет може да пристигне със закъснение на временния порт. Връзката в TIME_WAIT просто изхвърля тези пакети. Без TIME_WAIT локалният порт може да се използва повторно за друга връзка и да получава пакети от предишна връзка.
При много често приложение в мрежата, което отваря mysql-връзка на заявка, се очаква голямо количество TIME_WAIT връзки. Няма нищо лошо в това.
Могат да възникнат проблеми, ако обхватът на вашия локален порт е твърде нисък, така че вече не можете да отваряте изходящи връзки. Обичайното изчакване е настроено на 60 секунди. Така че вече може да възникне проблем при повече от 400 заявки в секунда при ниски диапазони.
Проверете:
За да проверите количеството TIME_WAIT, можете да използвате следната команда:
$ 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
Стойността след "tw", в този случай 33365, показва количеството TIME_WAIT.
Решения:
а. TIME_WAIT настройка (примери за базирана на Linux OS):
Намалете времето за изчакване за 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
Увеличете обхвата на портовете за локални портове:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Настройките /proc/sys/net/ipv4/tcp_tw_recycle
и /proc/sys/net/ipv4/tcp_tw_reuse
може и да е интересно. (Но ние изпитахме странни странични ефекти с тези настройки, така че по-добре ги избягвайте. Повече информация в този отговор
)
б. Постоянни връзки
Някои езици за програмиране и библиотеки поддържат постоянни връзки. Друго решение може да бъде използването на локално инсталиран прокси като "ProxySQL". Това намалява количеството нови и затворени връзки.