2009-08-15 16 views
157

Ostatnio mój procesor serwera działał bardzo wysoko.MySQL high CPU usage

Średnie obciążenia procesora: 13,91 (1 min) 11,72 (5 min) 8,01 (15 min), a moja witryna odnotowała jedynie niewielki wzrost ruchu.

Po uruchomieniu polecenia głównego zobaczyłem, że MySQL używa 160% CPU!

Ostatnio optymalizuję tabele i przełączyłem się na trwałe połączenia. Czy to może powodować, że MySQL używa dużych ilości procesora?

+4

Połączenia trwałe są zawsze najbardziej nieodpowiednie. – jason

+0

Zdejmę je teraz i zobaczę różnicę, ponieważ nigdy nie pamiętam, że cpu było ponad 2 miesiąc temu! – Juddling

+2

Serwery mają zazwyczaj więcej niż jeden rdzeń. Procent użycia procesora jest obliczany w odniesieniu do jednego rdzenia, inne słowa proces wykorzystujący maksymalnie dwa rdzenie będzie miał użycie procesora 200%. W tym przypadku MySQL zużywa 100% jednego rdzenia i 60% innego rdzenia. To nie znaczy, że wszystkie procesory są zużyte, najprawdopodobniej nadal ma co najmniej dwa bezpłatne procesory. – xaav

Odpowiedz

211

pierwsze powiedziałbym, prawdopodobnie chcesz aby wyłączyć trwałe połączenia, ponieważ prawie zawsze wyrządzają więcej szkód niż pożytku.

Po drugie, chciałbym powiedzieć, że chcesz dokładnie sprawdzić użytkowników MySQL, aby upewnić się, że nikt nie może łączyć się ze zdalnym serwerem. Jest to również ważna kwestia bezpieczeństwa do sprawdzenia.

Po trzecie, chciałbym włączyć dziennik MySQL Slow Query, aby mieć kontrolę nad zapytaniami wymagającymi długiego czasu, i użyć go, aby upewnić się, że nie masz żadnych zapytań z blokowaniem tabel kluczy również długie.

Kilka innych rzeczy, które można sprawdzić byłoby uruchomić następującą kwerendę, gdy obciążenie procesora jest wysoka:

SHOW PROCESSLIST; 

To pokaże jakieś pytania, które są aktualnie uruchomione lub w kolejce do uruchomienia, co się zapytanie jest i co robi (to polecenie skróci zapytanie, jeśli jest zbyt długie, możesz użyć POKAŻ PEŁNĄ LISTĘ PROCESÓW, aby zobaczyć pełny tekst zapytania).

Warto również, aby mieć oko na takie rzeczy jak swoich rozmiarów bufora, table cache, query cache i innodb_buffer_pool_size (jeśli używasz tabel InnoDB), a wszystkie te alokacji pamięci może mieć wpływ na wydajność zapytań, które mogą powodować MySQL do zjedzenia procesora.

Prawdopodobnie będziesz również chciał podać następującą lekturę, ponieważ zawierają one dobre informacje.

Jest to także bardzo dobry pomysł, aby użyć profilera. Coś, co możesz włączyć, kiedy chcesz, pokaże ci, jakie zapytania uruchamia twoja aplikacja, czy są duplikaty zapytań, jak długo trwają, itd. Itd. Przykład czegoś takiego, nad którym pracowałem, PHP Profiler ale jest ich wiele. Jeśli używasz oprogramowania, takiego jak Drupal, Joomla lub Wordpress, będziesz chciał zapytać w obrębie społeczności, ponieważ prawdopodobnie są dostępne dla nich moduły, które umożliwiają uzyskanie tych informacji bez potrzeby ręcznego integrowania czegokolwiek.

+10

Dziękuję bardzo za to, usunąłem trwałe połączenia, a następnie skonfigurowałem powolny dziennik zapytań. Przeczytałem dziennik i większość zapytań pochodziła z dwóch tabel, a tabele nie zostały poprawnie zaindeksowane! to było tylko około 10 minut, ale oto wynik: CPU średnie obciążenie 0,48 (1 min) 0,95 (5 min) 2,42 (15 min) dzięki bardzo – Juddling

+0

sam problem rozwiązany poprzez indeksowanie tablic, które spowalniają proces, dziękuję Steven i Juddling – gabrielem

+0

@Juddling Czy mógłbyś opracować jak zindeksować tabelę proszę? Być może jakiś link? Wiem, że minęło trochę czasu, ale jestem naprawdę nowy w tym. Przykro mi z noobish pytanie – JayVDiyk

21

Jeśli ten serwer jest widoczny dla świata zewnętrznego, to warto sprawdzić, czy to mający wiele żądań nawiązania połączenia ze światem zewnętrznym (czyli ludzi, którzy próbują włamać się do niego)

+0

Nie jestem pewien, dlaczego to przyciągnęło anonimowy głos, biorąc pod uwagę, że w niektórych systemach było to przyczyną przeszłości. –

+0

Myślę, że głosowanie w dół polega na tym, że posiadanie MySQL widocznego dla świata zewnętrznego nie jest dobrym pomysłem. – MikeKulls

+6

@MikeKulls Nie, to nie jest dobry pomysł, ponieważ będzie on służyć jako cel dla wielu osób, aby spróbować wejść, co da duże obciążenie procesora - stąd moja odpowiedź jako jeden z możliwych powodów. –

157

Ponieważ jest to top postu jeśli google dla MySQL wysokiego zużycia procesora lub obciążenia, dodam dodatkową odpowiedź:

W dniu 1 lipca 2012 roku, drugi skok został dodany do bieżącego UTC- czas, aby zrekompensować spowolnienie rotacji ziemi z powodu pływów.Po uruchomieniu ntp (lub ntpd) ta sekunda została dodana do zegara twojego komputera/serwera. Wydaje się, że MySQLd nie lubi tej dodatkowej sekundy w niektórych systemach operacyjnych i powoduje wysokie obciążenie procesora. Szybka korekta to (jako root):

$ /etc/init.d/ntpd stop 
$ date -s "`date`" 
$ /etc/init.d/ntpd start 
+20

Ponieważ oryginalny post był około 3 lata temu, wątpię, że to jest przyczyną problemu z oryginalnym plakatem. Ale to było przyczyną mojego problemu i uratował mnie właśnie teraz - dzięki! Więcej informacji: http://blog.mozilla.org/it/2012/06/30/mysql-and-the-leap-second-high-cpu-and-the-fix/ –

+5

Ten sam problem i rozwiązanie dla mnie na Ubuntu 12.04. Kroki, które należy rozwiązać nieco inaczej: service ntp stop && date -s "' date' "&& service ntp start Wykorzystanie procesora MySQL natychmiast spadło z 50 - 100% do 0 - 1% –

+0

tak, że zrobiło to na Amazon's EC2 linux AMI również, po prostu zamień "service ntpd stop/start" dla rzeczy init.d. –