Cari tahu apa proses apache penggunaan CPU tinggi yang sebenarnya dilakukan?

18

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 ()
BT643
sumber
1
Apache mendukung restart "anggun", jadi mengapa tidak?
poige
1
Saya pikir ketika kami mencobanya sebelumnya, itu tidak dapat memulai kembali dengan anggun karena proses apache "macet" ... walaupun itu mungkin salah, itu beberapa waktu yang lalu.
BT643
Trik lain adalah dengan menjalankan instance apache lain pada port yang berbeda, mengarahkan ulang koneksi baru ke sana.
poige

Jawaban:

9

Nah, kalau-kalau Anda merasa berani:

gdb -p 20788

kemudian terbitkan btuntuk melihat stack-frame, misalnya

Dan BTW, ada juga ltraceuntuk menyebutkan - coba juga.

UPD. : baik, ok, karena sekarang kami memiliki ide bahwa Apache benar-benar menjalankan sesuatu, mengapa Anda tidak melihat mod_statusoutput - Extended ?

poige
sumber
gdb tidak diinstal :( harus menunggu sampai saya kembali bekerja besok untuk melihat apakah saya dapat menginstalnya tanpa menyebabkan masalah apa pun .. ltracetidak menunjukkan output apa pun juga.
BT643
Baru saja menambahkan hasil dari gdb bt ke dalam posting awal .. tidak benar-benar memberi tahu saya sama sekali!
BT643
Oh, senang melihat saya telah menyarankan arah yang benar. )
poige
@ BT643, lihat UPD.
poige
4
Mod_status yang telah direalisasi sudah diaktifkan secara default, itu hanya terbatas pada akses dari 127.0.0.1. Saya baru saja masuk melalui SSH dan menyalurkan output ke file 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 :)
BT643
2

Pendekatan yang sangat mudah adalah menggunakan htop. Anda dapat mengurutkan untuk proses CPU tinggi dan kemudian gunakan

  • untuk stracesuatu proses
  • l untuk lsofmelihat file yang terbuka dari suatu proses
  • L ke ltrace.

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.

abuzze
sumber
1

Kamu bisa mencoba:

  • iotop (menunjukkan I / O pada sistem)
  • netstat -t (menunjukkan koneksi)
  • Lihatlah file log apache dan cari tahu apa yang server lakukan terakhir kali
  • atur beberapa RLimits untuk proses apache. Ketika batas-batas ini tercapai, proses akan mati, memberi Anda informasi lebih lanjut
Kai Bojens
sumber
0

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?

Harry Slaughter
sumber
Perlu diingat bahwa hanya satu proses anak berarti bahwa Apache hanya dapat melayani satu permintaan, dan jika anak tunggal itu macet, Apache tidak akan dapat melayani permintaan apa pun.
Stefan Lasiewski
Tidak dapat melakukan itu karena ini adalah server langsung dengan ratusan pengguna secara bersamaan (telah menambahkannya ke OP karena tidak jelas sebelumnya)
BT643
0

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.

vonbrand
sumber
PID rendah tidak selalu berarti proses yang lama. PID memiliki nilai maksimal, dan membungkus sehingga proses baru dapat dibuat menggunakan PID rendah.
Australia
0

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.

phoenix
sumber
Ini adalah solusi yang menarik tetapi saya bisa melihatnya mengambil lebih banyak sumber daya daripada nilainya, mengingat mod_statusmelakukan tugasnya dengan cukup baik.
Australia