Prowadzę raczej zajętą witrynę, aw godzinach szczytu widzę ponad 10.000 otwartych połączeń z serwerem bazy danych na moim serwerze internetowym po uruchomieniu polecenia netstat. 99% połączeń jest w TIME_WAIT
stanie.
Dowiedziałem się o tej zmiennej mysql: wait_timeout
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout dzisiaj. Mój jest nadal ustawiony na domyślny 28.800 sekund.
Czy obniżenie tej wartości jest bezpieczne?
Żadne z moich zapytań zwykle zajmuje sekundę. Więc głupie wydaje się utrzymywanie połączenia przez 480 minut.
Słyszałem też o używaniu mysql_pconnect
zamiast mysql_connect
, ale czytałem o tym tylko horrory, więc myślę, że trzymam się od tego z daleka.
wait_timeout
spowoduje zamknięcie połączenia, gdy oprogramowanie spodziewa się, że pozostanie otwarte.Odpowiedzi:
Obniżenie wartości jest dość trywialne bez ponownego uruchomienia mysql
Powiedzmy, że chcesz skrócić limity czasu do 30 sekund
Najpierw dodaj to do my.cnf
Następnie możesz zrobić coś takiego
Wszystkie połączenia DB po tym czasie przekroczą limit czasu za 30 sekund
OSTRZEŻENIE
Upewnij się, że używasz jawnie użyj mysql_close. Nie ufam Apache, jak większość programistów. Jeśli nie, czasami zdarzają się warunki wyścigu, w których Apache zamyka połączenie DB, ale nie informuje mysqld i mysqld utrzymuje połączenie otwarte, dopóki nie przekroczy limitu czasu. Co gorsza, możesz zobaczyć TIME_WAIT częściej. Wybierz mądrze wartości limitu czasu.
AKTUALIZACJA 2012-11-12 10:10 EDT
CAVEAT
Po zastosowaniu moich opublikowanych sugestii utwórz skrypt
/root/show_mysql_netstat.sh
o następujących liniach:Po uruchomieniu tego powinieneś zobaczyć coś takiego:
Jeśli nadal widzisz dużo mysql
TIME_WAITs
dla dowolnego serwera WWW, wykonaj dwa kroki eskalacji:ESKALACJA # 1
Zaloguj się do szkodliwego serwera WWW i uruchom ponownie apache w następujący sposób:
W razie potrzeby zrób to na wszystkich serwerach internetowych
ESKALACJA # 2
Możesz zmusić system operacyjny do zabicia TIME_WAIT dla mysql lub dowolnej innej aplikacji za pomocą:
Spowoduje to przekroczenie limitu czasu TIME_WAIT za 1 sekundę.
Udzielanie kredytu tam, gdzie jest on należny ...
TIME_WAIT
powstaje.źródło
Jeśli otrzymujesz wiele połączeń TIME_WAIT na serwerze MySQL, oznacza to, że serwer MySQL zamyka połączenie. Najbardziej prawdopodobnym przypadkiem w tym przypadku byłoby umieszczenie hosta lub kilku hostów na liście bloków. Możesz to usunąć, uruchamiając:
Aby uzyskać listę liczby połączeń, które masz dla każdego adresu IP:
Możesz również potwierdzić, że tak się dzieje, przechodząc do jednego z klientów, który ma problemy z połączeniem i telnetem z portem 3306. Wyświetli się komunikat zawierający coś takiego:
źródło
Jeśli masz wiele połączeń TIME_WAIT z serwerem MySQL, oznacza to, że kod uruchamia wiele zapytań w bazie danych DB i otwiera / zamyka połączenie dla każdego zapytania.
W takim przypadku należy użyć trwałej łączności z serwerem DB, używając rozszerzenia MySQLi.
http://php.net/manual/en/mysqli.persistconns.php
Jeśli nie możesz używać MySQLi, powinieneś zamiast tego użyć parametru thread_cache_size w konfiguracji MySQL.
źródło