2012-11-05 9 views
12

Dziś rano zauważyłem, że obciążenie serwera MySQL było wysokie. Max powinien wynosić 8, ale w pewnym momencie osiąga 100 punktów. Kiedy sprawdziłem listę procesów, znalazłem mnóstwo zapytań aktualizacyjnych (proste, zwiększające "hitcounter"), które były w stanie query end. Nie mogliśmy ich zabić (cóż, mogliśmy, ale pozostali w stanie nieskończonym przez cały czas) i nasza strona została zatrzymana.Mnóstwo stanów "Koniec zapytań" w MySQL, wszystkie połączenia wykorzystane w ciągu kilku minut.

Mieliśmy wiele problemów z ponownym uruchomieniem usługi i musieliśmy przymusowo zabić niektóre procesy. Kiedy to zrobiliśmy, udało nam się przywrócić system MySQLd, ale procesy zaczęły się natychmiastowo odbudowywać. O ile nam wiadomo, żadna konfiguracja nie została zmieniona w tym momencie.

Więc zmieniliśmy innodb_flush_log_at_trx_commit z 2 na 1 (zauważ, że potrzebujemy zgodności z ACID) w nadziei, że to rozwiąże problem i ustawimy połączenia w PHP/PDO jako trwałe. To wydawało się działać przez około godzinę, a potem połączenia znów zaczęły biec.

Na szczęście, ustawiłem serwer niewolników kilka miesięcy temu i byłem w stanie go promować i na razie to trwa, ale muszę zrozumieć, dlaczego tak się stało i jak go zatrzymać, ponieważ niewolnik serwer jest znacznie słabszy w porównaniu do mastera, więc muszę szybko wrócić.

Czy ktoś ma jakieś pomysły? Czy to możliwe, że coś wymaga oczyszczenia? Nie wiem co, może binarne logi czy coś takiego? Wszelkie pomysły w ogóle? Niezmiernie ważne jest, abyśmy mogli odzyskać ten serwer jako mistrz ASAP, ale szczerze mówiąc nie mam pojęcia, gdzie szukać, a wszystko, co do tej pory próbowałem, spowodowało jedynie tymczasową naprawę.

Pomoc! :)

Odpowiedz

22

Odpowiem tutaj na moje własne pytanie. Sprawdziłem rozmiary partycji za pomocą prostego polecenia df i tam mogłem zobaczyć, że/var był w 100% pełny. Znalazłem archiwum, które ktoś zostawił, o wielkości 10 GB. Usunięto to, uruchomiłem MySQL, uruchomiłem kwerendę PURGE LOGS BEFORE '2012-10-01 00:00:00', aby wyczyścić ładunek przestrzeni i zmniejszono rozmiar katalogu/var/lib/mysql z 346 GB do 169 GB. Zmieniono z powrotem na mistrza i wszystko znowu działa świetnie.

Z tego dowiedziałem się, że nasze pliki dziennika są BARDZO duże, BARDZO szybko. Tak więc ustanawiam rutynę konserwacji, aby nie tylko utrzymywać pliki dzienników w dół, ale także ostrzegać, gdy zbliżamy się do pełnej partycji.

Mam nadzieję, że przyda się to komuś w przyszłości, który natknie się na ten problem z tym samym problemem. Sprawdź swoją przestrzeń dyskową! :)

+1

Dzięki, to była poprawka dla naszego problemu.Dla innych znalezienie tej odpowiedzi, jeśli używasz klastra mysql Galera, sprawdź wszystkie serwery pod kątem miejsca na dysku, ponieważ utkną one na "końcu zapytania", nawet jeśli jest to tylko jeden z węzłów pełnych. – chris

6

Mamy bardzo podobny problem, gdzie lista procesowa mysql pokazała, że ​​prawie wszystkie nasze połączenia utknęły w stanie "koniec zapytania". Nasz problem dotyczył również replikacji i zapisu binlog.

Zmieniliśmy zmienną sync_binlog z 1 na 0, co oznacza, że ​​zamiast opróżniania binloga zmieniającego się na dysku przy każdym zatwierdzeniu, pozwala systemowi operacyjnemu decydować, kiedy fsync() do binlog. To całkowicie rozwiązało dla nas problem "końca zapytania".

Zgodnie z this post from Mats Kindahl pisanie do binloga nie będzie stanowić większego problemu w wydaniu MySQL w wersji 5.6.

+0

Dobrze wiedzieć. Dzięki! –

3

W moim przypadku było to wskazanie na maksymalizację operacji we/wy na dysku. Już zmniejszyłem fsyncs do minimum, więc to nie było to. Innymi objawami są pliki "log * .tokulog *", które zaczynają się gromadzić, ponieważ system nie może dogonić wszystkich zapisów.

Powiązane problemy