Witam drogich Czytelników w nowym roku. Dziś będzie post głównie na moje własne potrzeby, ale mam nadzieję, że komuś także się przyda.
Zauważamy, że mamy problem z serwerem – zaczyna zwalniać, praktycznie nie wyrabia. Podejrzewamy, że związanie jest to w jakiś sposób z bazą danych, ale jako że nie jesteśmy zbyt biegli w tym temacie, chcielibyśmy się skonsultować z osobą bardziej zorientowaną. Znajdujemy forum, na którym moglibyśmy szukać pomocy. W jaki sposób opisać problem aby ta pomoc była jak najbardziej użyteczna i aby obyło się bez kilku rund wymiany postów, które nic do rozwiązania problemu nie wnoszą?
Nawet jeśli samemu nie bardzo wiemy, co się na serwerze dzieje to jest kilka kroków, które dobrze jest wykonać a dzięki którym zbierzemy informacje umożliwiające osobom bardziej obytym z administracją serwerem przynajmniej wstępne zorientowanie się co jest grane. Dobrze byłoby zrobić to w momencie, kiedy wyraźnie czuć, że serwer jest obciążony. Zacznijmy od informacji o tym, jakie procesy są wykonywane na serwerze:
Przeklejamy wynik gdzieś na bok. To samo robimy z wynikiem poleceń:
vmstat 1 10
Tu z kolei dowiadujemy się jak wygląda zużycie pamięci na serwerze i jak wygląda obciążenie dysku.
Dobrze jest też zalogować się do konsoli MySQL i uruchomić zapytanie:
W ten sposób listujemy zapytania, które aktualnie są wykonywane na serwerze. Jeśli lista jest pusta, można kilkukrotnie wywołać to polecenie – możliwe że coś się za drugim czy trzecim razem pojawi.
Kolejna kwestia to włączenie i skonfigurowanie logowania wolnych zapytań. Trzeba się upewnić, czy logowanie to jest w ogóle włączone:
+---------------------------------------+---------------------------+
| Variable_name | Value |
+---------------------------------------+---------------------------+
| log_slow_queries | ON |
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/mysql-slow |
| slow_query_log_microseconds_timestamp | OFF |
+---------------------------------------+---------------------------+
4 rows in set (0.00 sec)
Jeśli tak (czyli jak widać na powyższym przykładzie), ustawiamy zmienną ‚long_query_time’ na 1:
W ten sposób włączamy logowanie wszystkich zapytań, które wykonywały się dłużej niż jedna sekunda. Czekamy jakiś czas, najlepiej byłoby przynajmniej 24 godziny, tak aby do logów załapały się zapytania z całego dnia. Całość agregujemy jednym ze skryptów, który do tego służy. Polecam mk-query-digest z pakietu Maatkit. Wybieramy te najbardziej obciążające typy zapytań (o tym jak czytać wyniki mk-query-digest będzie następny post) i sprawdzamy ich plany zapytań przy pomocy EXPLAIN. W przypadku mk-query-digest można po prostu przekopiować zaproponowane przez niego EXPLAINy i wykonać je w konsoli MySQL. Wynik działania mk-query-digest a także wyniki z planami zapytań dołączamy do reszty informacji.
Kolejną rzeczą, którą dobrze zrobić jest uruchomić jakiś skrypt, który podsumowuje statystyki działania serwera. Przykładowo może to być mysqlreport. Dzięki temu wiadomo będzie jak wygląda konfiguracja serwera w najbardziej istotnych elementach (cache, bufory), a także jak kształtuje się wykorzystanie zasobów przez serwer.
Jak to wszystko podsumować, informacji jest dużo. Trochę za dużo, aby przeklejać wszystko do jednego posta na forum czy też maila. Zawsze jednak można wystawić przez serwer www plik z takim raportem o stanie serwera i podać do niego link. Na podstawie informacji z tak przygotowanego raportu można wstępnie ustalić obecne obciążenie serwera, sprawdzić czy konfiguracja jest względnie poprawna a także czy źródło problemów z serwerem nie leży w złej strukturze bazy czy też nieoptymalnych zapytaniach. Jak na pierwszy post, jest to taka porcja informacji, dzięki której można już coś powiedzieć, albo coś wykluczyć.
Komentarze