Limity zasobów MySQL mogą powodować błędy, timeouty i spowolnienie strony. Taki problem może wystąpić nawet wtedy, gdy użycie CPU i RAM serwera wygląda prawidłowo.
Spis treści
Czym różnią się limity MySQL od limitów serwera
Limity serwera dotyczą dostępnych zasobów, takich jak procesor, pamięć RAM lub przestrzeń dyskowa. Limity MySQL dotyczą pracy samej bazy danych. Mogą zatrzymać nowe połączenie albo opóźnić zapytanie, mimo że serwer nie wykorzystuje całej dostępnej mocy.
Przykładowo, MySQL może osiągnąć maksymalną liczbę jednoczesnych połączeń, gdy aplikacja otwiera wiele połączeń lub nie zamyka ich po zakończeniu pracy. W takiej sytuacji strona może zwracać błąd, chociaż ogólne wykresy CPU i RAM nie wskazują przeciążenia.
Maksymalna liczba połączeń i błąd 1040
Limit max_connections określa, ile połączeń do MySQL może działać jednocześnie. Po osiągnięciu tej wartości kolejne próby połączenia są odrzucane. Typowym komunikatem jest ERROR 1040 (HY000): Too many connections, czyli „zbyt wiele połączeń” ERROR 1040 w MySQL.
Objawy tego limitu mogą obejmować niedostępną stronę, błędy aplikacji oraz problemy z logowaniem do panelu lub sklepu. Nie musi temu towarzyszyć wysokie użycie CPU. Problem dotyczy liczby aktywnych sesji, a nie tylko mocy obliczeniowej.
Jak sprawdzić problem z połączeniami
- Sprawdź, czy w logach aplikacji lub MySQL pojawia się
ERROR 1040albo komunikat o przekroczeniu liczby połączeń. - Porównaj bieżącą liczbę połączeń z limitem
max_connections. - Sprawdź, czy połączenia pozostają aktywne dłużej, niż wymaga tego aplikacja. Pomocne są dane o liczbie połączeń i ich czasie trwania.
- Ustal, czy wzrost liczby połączeń występuje podczas konkretnego zadania, na przykład większego ruchu albo operacji wykonywanej przez aplikację.
Samo zwiększenie limitu nie zawsze rozwiązuje problem. Większa liczba połączeń może zwiększyć obciążenie MySQL. Najpierw warto sprawdzić sposób zarządzania połączeniami oraz zapytania wykonywane przez aplikację. Zestawienia instancji MySQL służą do obserwowania między innymi liczby połączeń i obciążenia bazy MySQL Instance Summary.
Czas wykonywania zapytań i timeout
Czas zapytania to czas potrzebny MySQL na wykonanie operacji i zwrócenie wyniku. Gdy zapytanie trwa zbyt długo, aplikacja może czekać na odpowiedź, a po przekroczeniu ustalonego czasu zakończyć próbę komunikatem timeout. Timeout nie musi oznaczać braku zasobów serwera. Może wynikać z oczekiwania na blokadę, dużego zakresu danych albo innych aktywnych zapytań MySQL Timeout Explained.
Objawy i diagnostyka
- pojedyncze podstrony ładują się znacznie dłużej niż pozostałe,
- operacje w panelu lub WooCommerce kończą się timeoutem,
- liczba aktywnych połączeń rośnie, ponieważ każde z nich czeka na zakończenie zapytania,
- CPU może pozostawać na umiarkowanym poziomie, gdy MySQL głównie oczekuje.
Porównaj czas wykonywania zapytań i moment występowania opóźnień. Sprawdź, czy problem dotyczy jednego zapytania, jednej funkcji aplikacji czy całej bazy. Nie zwiększaj czasu oczekiwania jako pierwszego działania. Dłuższy timeout może tylko sprawić, że połączenia będą zajęte przez dłuższy czas.
Pojemność bufora MySQL
Bufor to obszar pamięci używany przez MySQL do przechowywania danych lub wyników potrzebnych podczas pracy. Gdy pojemność bufora jest niewystarczająca dla wykonywanych operacji, baza musi częściej odczytywać dane z dysku. Strona może wtedy działać wolno mimo prawidłowego użycia CPU.
W diagnostyce porównaj rozmiar bufora z charakterem zapytań i obserwuj, czy wzrost ruchu powoduje więcej operacji odczytu oraz dłuższy czas odpowiedzi. Zmiana ustawień bufora wpływa na zużycie pamięci, dlatego przed zmianą sprawdź dostępne zasoby i wykonaj test po zmianie. Dane o pracy instancji i buforach można analizować w zestawieniu MySQL Instance Summary dokumentacja Percona Monitoring and Management.
Blokady tabel i oczekiwanie na dostęp
Blokada tabeli sprawia, że jedno zapytanie musi czekać, aż inne zakończy operację na tej samej tabeli. W tym czasie CPU może nie być zajęty, ponieważ MySQL oczekuje na zwolnienie dostępu. Dla użytkownika objawem jest wolne ładowanie strony, zawieszanie zapisu albo timeout.
Sprawdź, czy opóźnienie pojawia się podczas zapisu, aktualizacji lub usuwania danych. Następnie porównaj czas trwania zapytań z informacjami o oczekiwaniu na blokadę. Jeżeli problem występuje tylko przy określonej operacji, analizuj ją osobno zamiast zwiększać ogólne limity serwera.
Jak połączyć objawy z właściwym limitem
| Objaw | Najbardziej prawdopodobny obszar | Pierwszy krok |
|---|---|---|
| ERROR 1040 i odrzucane połączenia | Maksymalna liczba połączeń | Sprawdź max_connections i liczbę aktywnych sesji. |
| Timeout przy wybranej operacji | Długie zapytanie lub blokada | Sprawdź czas zapytania i oczekiwanie na dostęp do tabeli. |
| Stałe opóźnienia odczytu przy normalnym CPU | Pojemność bufora lub odczyt danych | Porównaj pracę bufora z czasem odpowiedzi zapytań. |
| Wolny zapis danych | Blokada tabeli lub długie zapytanie | Ustal, które zapytanie blokuje operację. |
Najpierw określ, czy problem dotyczy liczby połączeń, czasu zapytań, pamięci bufora czy blokady. Dopiero potem zmieniaj konfigurację. Przy zmianach wpływających na bazę wykonaj kopię zapasową i zachowaj możliwość cofnięcia modyfikacji.
