Obecnie mamy kilka problemów z naszym serwerem, gdzie sporadycznie wydaje się, że otrzymujemy procesy Apache, które po prostu działają i działają, zajmując 100% procesora.
Podczas uruchamiania góry widzimy:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20788 www-data 20 0 318m 18m 3984 R 100 0.0 40:29.21 /usr/sbin/apache2 -k start
23523 www-data 20 0 319m 20m 4684 R 100 0.0 4:12.36 /usr/sbin/apache2 -k start
Chcę spróbować ustalić, co powoduje skrypt (lub cokolwiek to jest), więc próbowałem:
strace -p 20788
Ale to wcale nie pokazuje żadnych wyników (zostawiłem je na około 10 minut i nic nie pokazuje). Z mojego zrozumienia może to oznaczać, że utknął w nieskończonej pętli i nie ma żadnych „wywołań systemowych” do wyświetlenia.
Czy jest coś jeszcze, co mogę zrobić, aby pokazać, co się dzieje?
Dzięki
Edycja - zapomniałem wspomnieć, że jest to serwer na żywo z kilkuset użytkownikami jednocześnie! Tak naprawdę nie mogę po prostu swobodnie próbować zmieniać opcji konfiguracji i restartować apache.
Edycja 2 - Śledzenie (bt) z gdb nie wydaje się tak przydatne, gdy PHP nie jest skonfigurowane z --enable-debug - pokazuje tylko „execute ()”, ale muszę wiedzieć, co to jest skrypt PHP faktycznie działa .. czy jest jakiś inny sposób?
#0 0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so
#1 0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so
#2 0x00007f6c1438b970 in zend_execute_scripts () from /usr/lib/apache2/modules/libphp5.so
#3 0x00007f6c14337fe3 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
#4 0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so
#5 0x00007f6c18912508 in ap_run_handler ()
#6 0x00007f6c1891297e in ap_invoke_handler ()
#7 0x00007f6c18922570 in ap_process_request ()
#8 0x00007f6c1891f398 in ?? ()
#9 0x00007f6c18918fa8 in ap_run_process_connection ()
#10 0x00007f6c189271d0 in ?? ()
#11 0x00007f6c1892793a in ?? ()
#12 0x00007f6c189284e7 in ap_mpm_run ()
#13 0x00007f6c188fd4a4 in main ()
źródło
Odpowiedzi:
Cóż, jeśli czujesz się odważny:
gdb -p 20788
następnie wydaj,
bt
aby zobaczyć ramkę stosu, na przykładA tak przy okazji,
ltrace
warto wspomnieć - wypróbuj również.UPD. : cóż, ok, skoro teraz mamy pomysł, że Apache naprawdę coś działa, dlaczego nie spojrzeć na
mod_status
wynik - Rozszerzony ?źródło
ltrace
też nie pokazał żadnych danych wyjściowych.curl domain.com/server-status > randomfile.html
- a następnie przejrzałem plik. Okazało się, że to stary kod programisty utknął w pętli (plik PHP)! Wszystko posortowane teraz. Dzięki za pomoc :)Bardzo łatwym podejściem jest użycie
htop
. Możesz sortować według procesów o wysokim procesorze, a następnie użyćstrace
procesulsof
zobaczyć otwarte pliki procesówltrace
.Odkryłem, że co najmniej jedna z tych opcji znajduje skrypt, który generuje obciążenie, i oczywiście można go użyć na produkcyjnym serwerze internetowym do debugowania.
źródło
Możesz spróbować:
źródło
Twoje polecenie powinno działać, pod warunkiem że wykonasz żądanie HTTP, które wyzwala ten PID.
Może chcesz tymczasowo ponownie skonfigurować Apache za pomocą tylko jednego procesu potomnego?
źródło
PID tej instancji apache jest niski, może być ojcem całej partii. To z pewnością tłumaczy wysokie zużycie procesora (pozostaje w pobliżu, inne są odradzane i przywoływane zgodnie z obciążeniem). Dużo skumulowanego czasu procesora może po prostu oznaczać, że działał on przez długi czas. Brak danych wyjściowych
strace(1)
oznacza po prostu, że nie wywołał żadnych poleceń systemowych. Tak, może być w ciasnej pętli, ale apache jest w zasadzie we / wy przez sieć, więc sądzę, że nie robi nic pożytecznego. W każdym razie dziwne 100% jednego procesora.źródło
Spróbuj tego:
1) Uruchom dziennik z datą / godziną, skryptem PHP i identyfikatorem PID
getmypid()
2) Następnie obserwuj swój serwer za pomocą
top
3) Gdy zobaczysz, że proces apache idzie w górę, wyszukaj w dziennikach tę samą datę / godzinę i PID. Powinieneś być w stanie znaleźć problematyczny skrypt.
źródło
mod_status
robi to całkiem dobrze.