Saat ini mengalami beberapa masalah dengan server kami di mana, sebentar-sebentar, kami sepertinya mendapatkan proses apache yang baru saja berjalan dan berjalan, mengambil CPU 100%.
Saat menjalankan teratas, kita melihat yang berikut:
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
Saya ingin mencoba dan mencari tahu skrip apa (atau apa pun itu) yang menyebabkan ini, jadi saya mencoba:
strace -p 20788
Tapi itu tidak menunjukkan output sama sekali (saya meninggalkannya selama sekitar 10 menit, dan tidak menunjukkan apa-apa). Dari pemahaman saya, ini bisa berarti macet di infinite loop, dan tidak ada "panggilan sistem" untuk ditampilkan.
Apakah ada hal lain yang bisa saya lakukan untuk menunjukkan apa yang terjadi?
Terima kasih
Sunting - Lupa menyebutkan, ini adalah server langsung dengan beberapa ratus pengguna sekaligus! Jadi saya tidak bisa benar-benar hanya dengan bebas mencoba mengubah opsi konfigurasi dan me-restart apache.
Sunting 2 - Backtrace (bt) dari gdb tampaknya tidak terlalu berguna ketika PHP tidak dikonfigurasikan dengan --enable-debug - hanya menunjukkan "execute ()", tetapi saya perlu tahu apa itu skrip PHP sebenarnya sedang berjalan .. adakah cara lain?
#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 ()
sumber
Jawaban:
Nah, kalau-kalau Anda merasa berani:
gdb -p 20788
kemudian terbitkan
bt
untuk melihat stack-frame, misalnyaDan BTW, ada juga
ltrace
untuk menyebutkan - coba juga.UPD. : baik, ok, karena sekarang kami memiliki ide bahwa Apache benar-benar menjalankan sesuatu, mengapa Anda tidak melihat
mod_status
output - Extended ?sumber
ltrace
tidak menunjukkan output apa pun juga.curl domain.com/server-status > randomfile.html
- kemudian melihat file. Ternyata itu adalah kode pengembang lama terjebak dalam satu lingkaran (file PHP)! Semua disortir sekarang. Terima kasih atas bantuannya :)Pendekatan yang sangat mudah adalah menggunakan
htop
. Anda dapat mengurutkan untuk proses CPU tinggi dan kemudian gunakanstrace
suatu proseslsof
melihat file yang terbuka dari suatu prosesltrace
.Saya menemukan bahwa setidaknya satu dari opsi itu menemukan skrip yang menghasilkan beban dan tentu saja Anda dapat menggunakan ini pada server web produksi untuk melakukan debug.
sumber
Kamu bisa mencoba:
sumber
Perintah Anda harus berfungsi asalkan Anda membuat permintaan HTTP yang memicu PID itu.
Mungkin Anda ingin mengkonfigurasi ulang Apache untuk sementara dengan hanya satu proses anak?
sumber
PID dari instance apache itu rendah, mungkin itu adalah ayah dari semua lot. Itu pasti akan menjelaskan penggunaan CPU yang tinggi (itu tetap ada, yang lain melahirkan dan dipanggil kembali sesuai dengan beban). Banyak akumulasi waktu CPU mungkin hanya berarti telah berjalan untuk waktu yang lama. Tidak ada output dari
strace(1)
hanya berarti tidak ada panggilan sistem. Ya, itu mungkin berada dalam lingkaran yang ketat, tetapi apache pada dasarnya I / O di atas 'net, jadi saya pikir itu tidak melakukan sesuatu yang berguna. Aneh 100% dari satu CPU, dalam hal apapun.sumber
Coba ini:
1) Mulai log dengan tanggal / waktu, skrip PHP, dan PID menggunakan
getmypid()
2) Kemudian tonton server Anda dengan
top
3) Ketika Anda melihat proses apache semakin tinggi, cari tanggal / waktu dan PID yang sama di log Anda. Anda harus dapat menemukan skrip yang bermasalah.
sumber
mod_status
melakukan tugasnya dengan cukup baik.