Dziś strona znowu utknęła, a w ogóle można znaleźć dużo snu
Przyczyny snu:
1 Program klienta nie wywołał mysql_close() przed wyjściem.
2 Klient spał dłużej niż wait_timeout lub interactive_timeout sekund, nie wysyłając żadnych żądań do serwera.
3 Program klienta zakończył się nagle w trakcie transferu danych
Jeśli liczba procesów uśpienia w tym samym okresie jest zbyt wysoka, a łączna liczba połączeń w innych stanach przekroczy wartość max_connection, MySQL nie może już przetwarzać żadnych żądań poza użytkownikiem głównym, nie może nawiązać połączenia z żadnym żądaniem lub zawiesza się bezpośrednio
Rozwiązanie:
1. Po pierwsze, sprawdź, czy Twój program korzysta z metody pconnect, a po drugie, sprawdź, czy mysql_close() jest wywoływany na czas przed uruchomieniem strony. Staraj się nie używać metody pconnect, czyli używaj mysql_connect. Po uruchomieniu programu mysql_close powinien być wywołany jawnie
2. Dodaj wait_timeout i interactive_timeout do my.cnf, ustaw wartość mniejszą, domyślnie wartość wait_timeout to 8 godzin, możesz zmienić na 1 godzinę lub pół godziny. Dzięki temu mysql szybciej zabije martwe połączenia. Zapobiegaj temu, by łączna liczba połączeń przekroczyła wartość max_connection.
wait_timeout zbyt duże spowoduje zwolnienie dużej liczby procesów SLEEP w MySQL na czas, co obniża wydajność systemu, ale jeśli ustawienia są zbyt małe, możesz napotkać problemy takie jak "MySQL zniknął"
Ustaw wartość max_connection na wyższą, ale to oczywiście nie jest odpowiednie – im więcej masz połączeń, tym większy stres wywiera to na serwerze. W rzeczywistości te połączenia są zbędne, a ich jak najszybsze wyeliminowanie to najlepsza strategia.
3. Analizuj zapytanie SQL systemu krok po kroku, znajdź zbyt wolny SQL i zoptymalizuj go
1)interactive_timeout: Znaczenie parametru: Liczba sekund, w których serwer czeka na aktywność, zanim wyłączy połączenie interaktywne. Interaktywny klient definiowany jest jako klient, który korzysta z CLIENT_INTERACTIVE opcji w mysql_real_connect(). Domyślny parametr: 28800 sekund (8 godzin)
(2)wait_timeout: Znaczenie parametru: Liczba sekund, w których serwer czeka na aktywność przed zamknięciem połączenia nieinteraktywnego. Po rozpoczęciu wątku wartość sesji wait_timeout jest inicjalizowana na podstawie globalnej wait_timeout lub globalnej wartości interactive_timeout, w zależności od typu klienta (zdefiniowanego CLIENT_INTERACTIVE opcjach połączenia mysql_real_connect()). Domyślny parametr: 28800 sekund (8 godzin)
Istnieje górna granica maksymalnej liczby połączeń, które MySQL Server może obsłużyć, ponieważ każde połączenie jest nawiązywane i zużywa pamięć, więc oczekujemy, że klienci rozłączą się i zwolnią zajętą pamięć po połączeniu z MySQL Server do wykonania odpowiedniej operacji. Jeśli Twój serwer MySQL ma dużą liczbę bezczynnych połączeń, nie tylko będą one bezużytecznie zużywać pamięć, ale jeśli połączenia będą się kumulować i otwierać, ostatecznie osiągną maksymalną liczbę połączeń w MySQL Server, co zgłosi błąd "zbyt wiele połączeń". Ustawienie wartości wait_timeout powinno być oceniane zgodnie z działaniem systemu. Po pewnym czasie działania systemu możesz sprawdzić status połączenia bieżącego systemu za pomocą polecenia show processlist; jeśli znajdziesz dużą liczbę połączonych procesów w stanie uśpienia, oznacza to, że ustawienie parametrów jest zbyt duże i możesz wprowadzić odpowiednie korekty, by wprowadzać mniejsze zmiany.
Polecenie SQL:
Ta metoda modyfikacji jest wPo ponownym uruchomieniu usługi mysql będzie ona nieprawidłowa, dlatego najlepiej skonfigurować te dwie właściwości w pliku konfiguracyjnym MySQL.
Zmodyfikuj plik my.cnf w Linuksie:
|