MySQL - zużycie procesora przez bazę na poziomie 99% mimo prostych zapytań.

0

Cześć,
Pisałem pewną usługę do generowania plików pdf. Ona sama jest napisana w PHP w którym jest dość sporo obliczeń, do bazy, na iterację, idą 4 zapytania, selecty bez joinów ani lików. Mimo tego zużycie generowane przez mysqld jest na poziomie 85-100%. Wszystkie zapytania sprawdziliśmy ile trwają, explainowaliśmy je i nie było nic co mogło by chociaż wskazywać problem. Generowanie jednego plików trwa 20-30s - w tym czasie idą 4 mega proste zapytania do bazy. Macie jakiś pomysł co może to wywoływać? Dodam że nic innego w tym czasie na bazie się nie dzieje.

0

Jeżeli to Windows 10 to mam odpowiedź: nikomu nie udało się tego obejść :)

edit: W sensie mysql mi tak mulił na Windows 10, że dałem sobie spokój.

0

Nie, to nie windows :) Niestety język nie jest tu przeszkodą, bo to nie on zarzyna procka.

1

Ja stosuję bardzo prostą technikę:

  • strace - podpinam się pod proces i patrzę co robi w kontekście wywołań systemowych, czasem ilosciowo ile jest wywołań danego typu, albo ile czasu upływa między wywołaniami.
  • próbkuję stack procesu np. co sekundę
[root@pkwcent datafiles]# while [ 1 -eq 1 ]; do echo "SAMPLE_START"; pstack 8735; echo "SAMPLE END"; sleep 1; done
SAMPLE_START
#0  0x00007fc6f46310a3 in ?? ()
#1  0x00005635d9bd8cb9 in WaitEventSetWait ()
#2  0x00005635d9bd90e9 in WaitLatchOrSocket ()
#3  0x00005635d9b8b5de in CheckpointerMain ()
#4  0x00005635d99fb714 in AuxiliaryProcessMain ()
#5  0x00005635d9b95a8b in ?? ()
#6  0x00005635d9b96e02 in ?? ()
#7  <signal handler called>
#8  0x00007fc6f46293a3 in ?? ()
#9  0x00005635d996f1a3 in ?? ()
#10 0x00005635d9b98492 in PostmasterMain ()
#11 0x00005635d9970f44 in main ()
SAMPLE END
SAMPLE_START
#0  0x00007fc6f46310a3 in ?? ()
#1  0x00005635d9bd8cb9 in WaitEventSetWait ()
#2  0x00005635d9bd90e9 in WaitLatchOrSocket ()
#3  0x00005635d9b8b5de in CheckpointerMain ()
#4  0x00005635d99fb714 in AuxiliaryProcessMain ()
#5  0x00005635d9b95a8b in ?? ()
#6  0x00005635d9b96e02 in ?? ()
#7  <signal handler called>
#8  0x00007fc6f46293a3 in ?? ()
#9  0x00005635d996f1a3 in ?? ()
#10 0x00005635d9b98492 in PostmasterMain ()
#11 0x00005635d9970f44 in main ()
SAMPLE END
SAMPLE_START
#0  0x00007fc6f46310a3 in ?? ()
#1  0x00005635d9bd8cb9 in WaitEventSetWait ()
#2  0x00005635d9bd90e9 in WaitLatchOrSocket ()
#3  0x00005635d9b8b5de in CheckpointerMain ()
#4  0x00005635d99fb714 in AuxiliaryProcessMain ()
#5  0x00005635d9b95a8b in ?? ()
#6  0x00005635d9b96e02 in ?? ()
#7  <signal handler called>
#8  0x00007fc6f46293a3 in ?? ()
#9  0x00005635d996f1a3 in ?? ()
#10 0x00005635d9b98492 in PostmasterMain ()
#11 0x00005635d9970f44 in main ()
SAMPLE END
SAMPLE_START
#0  0x00007fc6f46310a3 in ?? ()
#1  0x00005635d9bd8cb9 in WaitEventSetWait ()
#2  0x00005635d9bd90e9 in WaitLatchOrSocket ()
#3  0x00005635d9b8b5de in CheckpointerMain ()
#4  0x00005635d99fb714 in AuxiliaryProcessMain ()
#5  0x00005635d9b95a8b in ?? ()
#6  0x00005635d9b96e02 in ?? ()
#7  <signal handler called>
#8  0x00007fc6f46293a3 in ?? ()
#9  0x00005635d996f1a3 in ?? ()
#10 0x00005635d9b98492 in PostmasterMain ()
#11 0x00005635d9970f44 in main ()
SAMPLE END
SAMPLE_START
#0  0x00007fc6f46310a3 in ?? ()
#1  0x00005635d9bd8cb9 in WaitEventSetWait ()
#2  0x00005635d9bd90e9 in WaitLatchOrSocket ()
#3  0x00005635d9b8b5de in CheckpointerMain ()
#4  0x00005635d99fb714 in AuxiliaryProcessMain ()
#5  0x00005635d9b95a8b in ?? ()
#6  0x00005635d9b96e02 in ?? ()
#7  <signal handler called>
#8  0x00007fc6f46293a3 in ?? ()
#9  0x00005635d996f1a3 in ?? ()
#10 0x00005635d9b98492 in PostmasterMain ()
#11 0x00005635d9970f44 in main ()
SAMPLE END

Tak zebrany materiał przetwarzam awkiem/perlem i buduję histogram i patrzę na najczęstsze stacki, to daje mi jakiś punkt zaczepienia drążę problem dalej.
To da Ci pojęcie co dzieje się w "user space", jak będziesz miał potrzebę zejścia niżej, tzn. do tego co robi kernel, to musisz mieć w kernelu odpowiednie wsparcie do tego typu zabaw.

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