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
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.