Proces MySQL zajmuje ponad 100% wykorzystania procesora

12

Mam problemy z moim serwerem LAMP. Ostatnio wszystko stało się bardzo wolne, mimo że liczba odwiedzających na moich stronach niewiele się zmieniła. Kiedy uruchamiam toppolecenie, mówi, że proces MySQL przejął 150-200% procesora. Jak to możliwe, zawsze myślałem, że 100% to maksimum?

Używam wersji serwerowej Ubuntu 9.04 z 1,5 GB pamięci RAM.

my.cnf ustawienia:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

Oto wynik MySQLTuner :

Wyjście MySQLTuner

topPolecenie:

najwyższa wydajność

Co może być przyczyną tego problemu? Czy mogę wprowadzić zmiany w moim, my.cnfaby zapobiec zawieszeniu się serwera?

Temnovit
źródło

Odpowiedzi:

15
  1. Zwiększ Bufor Kluczów (twój ma obecnie 64 MB, ale całkowite indeksy to 116 mln, więc wstaw co najmniej 128 MB). Powinien pomóc natychmiast.
  2. Uruchom mysqloptimize i mysqlrepair na swoich stołach
  3. Zwiększ pamięć podręczną tabeli / zmniejsz całkowitą liczbę tabel, aby zwiększyć wskaźnik trafień w pamięci podręcznej tabel. Może masz jakieś nieużywane lub stare tabele, które można usunąć.

Inne zalecane opcje konfugracji:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • log-queries-not-using-indexes

Po pewnym czasie sprawdź plik dziennika.

Shakalandy
źródło
Dziękuję za rekomendacje, wypróbuję je i dam znać, czy to pomogło.
Temnovit,
powiedz mi proszę, jak obliczyłeś, że łączne indeksy wynoszą 116 mln?
Temnovit,
mam to sam :)
Temnovit,
5

Masz procesor, który ma więcej niż jeden rdzeń lub masz wiele procesorów. Jeśli masz dwa rdzenie, a proces wykorzystuje 100% obu rdzeni, wyświetli się jako 200% u góry.

Podobnie, prawdopodobnie działa to zgodnie z przeznaczeniem - nie ma nic złego w konfiguracji. Jeśli często się zawieszasz, na podstawie tego, co opublikowałeś, możesz spróbować dodać do swoich tabel odpowiednie indeksy (lub zoptymalizować zapytania).

Kyle Brantley
źródło
5

Uruchom, top -Haby zobaczyć wszystkie działające wątki, a nie tylko cały proces. Ponadto, jeśli naciśniesz 1klawisz na górze, pokaże użycie procesora dla poszczególnych procesorów / rdzeni.

Niall Donegan
źródło
Dzięki, to mi naprawdę pomogło - używałem topu od lat i nie wiedziałem, że ma taką zdolność. Odkryłem, że jest jeden „wieczny” wątek mysql, który zużywa 60% procesora użytkownika przez cały czas, a wątki zapytania przychodzą i wychodzą na wierzch tego. Teraz, aby dowiedzieć się, co właściwie robi ten wątek ...
scipilot 22.04.16
1

Mysql ma wiele procesów (wątków) działających niezależnie, jeden, na przykład, jest odpowiedzialny za zapis danych z pamięci na dysk. Dzięki wielu rdzeniom w procesorze (i / lub wielu procesorom) działa więcej niż jeden wątek, dzięki czemu może on uruchamiać ponad 100% jednego rdzenia - na uproszczonym poziomie, może 75% każdego z dwóch rdzeni działa , co daje 150%.

Alister Bulman
źródło
1

Zauważyłem problem niezwiązany z procesorem. Jeśli używasz Apache i MySQL na tym samym serwerze, możesz osiągnąć złe warunki ( RAM ), gdy zwiększysz aktywność Apache.

MySQLTunner mówi ci, że używając 200 dostępnych połączeń (twoje maksymalne ustawienie połączenia) wypełnisz pamięć RAM. Powiedzmy, że masz ograniczony proces Apache do 150, na pewno nie będziesz mieć wystarczającej ilości pamięci RAM, gdy MySQL i Apache spróbują użyć 150 połączeń (ponieważ Apache jest również dobrym serwerem pamięci RAM).

Chodzi o pamięć RAM i być może jeszcze nie trafiłeś :-) Najważniejsze polecenia pokazują tylko 15 procesów apache (ale przeciążasz się średnio 3/6/16, co oznacza, że ​​burza miała miejsce 15 minut temu i jest teraz w odejście).

Jeśli chodzi o problem z procesorem, aby uzupełnić dobrą odpowiedź shakalandy , może to wynikać z jednego zapytania. Może znajdować się na dużym stole lub wykonywać wiele zadań związanych z ponownym indeksowaniem, lub używać dużej liczby plików tymczasowych, brakującego indeksu (usunięty?) Itp. Jedynym sposobem na jego wykrycie jest aktywowanie dziennika powolnych zapytań (być może z wysokim progiem, jak 8s). Następnie użyj narzędzia mysqlsla , aby przeanalizować ten wolny dziennik zapytań i uruchomić wyjaśnienie zidentyfikowanych zapytań.

regilero
źródło
Dziękuję, mysql to nie jedyny proces w okolicy :)
Temnovit,