mysql wykorzystuje ponad 100% CPU

0

Witam.
Mam serwis postawiony na dedyku, na którym jest spory ruch.
W momencie, gdy kilku osób na raz otworzy daną stronę (na której wywołanych jest 6 zapytań do bazy) użycie CPU skacze z 5,6% na 200 a nawet 300%, gdy ruch utrzymywany jest dłuższy czas cały serwer zaczyna "zamulać". Zapytania zoptymalizowałem jak tylko się dało, poniżej wrzucam moje ustawienia my.cnf.
Może w tym tkwi problem?
Dodam jeszcze że plik z logami 'slow_query' nawet nie został utworzony w tej destynacji, czyli tak jakby tych wolnych zapytań nie było.
screenshot-20200512111548.png

2

Config to chyba ostatnia rzecz jaką należy sprawdzać w takiej sytuacji. Lepiej pokaż te zapytania, zrzuty struktury tabel i ilości rekordów w poszczególnych tabelach bo pewnie nie pozakładałeś indeksów albo zadajesz nieoptymalne zapytania do bazy.

0

A w kwestii CPU to podawanie, że skoczyło do 300% jest delikatnie ujmując kontrowersyjne.
Strzelam w ciemno, że zobaczyłeś tą wartość za pomocą top. Polecam htop.

0
katakrowa napisał(a):

Config to chyba ostatnia rzecz jaką należy sprawdzać w takiej sytuacji. Lepiej pokaż te zapytania, zrzuty struktury tabel i ilości rekordów w poszczególnych tabelach bo pewnie nie pozakładałeś indeksów albo zadajesz nieoptymalne zapytania do bazy.

Tabela Tools 67 pól, na tąchwilę jakieś 200 rekordów

screenshot-20200512135742.png

Tabela clicks_user, zależy od usera, na ten moment największa 0,5mln rekordów pobieram tutaj tylko 1 pole
screenshot-20200512135925.png

screenshot-20200512140059.png

screenshot-20200512140140.png

Wszystkie zapytania.
A wziąłem się za ustawienia serwera, gdyż ma on takie parametry i pomyślałem, że domyślne ustawienia w pełni mogą nie wykorzystywać jego możliwości.
screenshot-20200512140318.png

1

Co pokazuje explain na tych zapytaniach?
Jak masz ustawione indeksy?

1
  1. Z kodu wygląda tak jakbyś nie wiedział co to są zmienne wiązane.
  2. Co robi CPU jak jest zajęty w 300%? Jak tego nie zrozumiesz to będziesz "tunował" w ciemno.
  3. Czy masz jakieś transakcje, które trwają "długo" i mogą blokować przez ten czasu pozostałe sesje? Wówczas te 300% szło by na "spin locking" -> hasło "spin lock polling".

Proponowałby podejście niskopoziomowe (nie znam się na mysqlu, więc może da się prościej jakimś dedykowanym mysqlowym narzędziem, które pokaże "hot spoty"):
a) jeśli wystąpi "300% obciążenia", sprawdzić, które procesy generują duże obciążenie
b) wybrać taki proces i próbkować stosy (pstack <pid> w odstępach np. 1 sekundowych przez minutę)

Zbudować histogram ( stack trace, częstość wystąpienia) -> i spróbować zrozumieć co się dzieje. Może wisi na wywołaniu systemowym, może na aplikacyjnym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1