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.
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.
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.
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
Tabela clicks_user, zależy od usera, na ten moment największa 0,5mln rekordów pobieram tutaj tylko 1 pole
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.
Co pokazuje explain
na tych zapytaniach?
Jak masz ustawione indeksy?
- Z kodu wygląda tak jakbyś nie wiedział co to są zmienne wiązane.
- Co robi CPU jak jest zajęty w 300%? Jak tego nie zrozumiesz to będziesz "tunował" w ciemno.
- 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.