Jika Anda telah bekerja dengan PHP, Anda mungkin menghadapi situasi di mana Anda menjalankan proses PHP yang tidak berfungsi seperti yang diharapkan. Seringkali ini dapat direproduksi dan dapat diselidiki dalam lingkungan pengembangan dengan Xdebug, atau yang aneh die('here'); jika Anda tidak memiliki Xdebug untuk ditangani
Meskipun tidak siap direproduksi, Anda mungkin memiliki alat terhubung yang menghasilkan profil dari lingkungan produksi Anda (mis. g. Tideways, XHProf, Blackfire, NewRelic, dll), memungkinkan Anda menangkap profil yang memungkinkan Anda menentukan apa yang terjadi
Bagaimana dengan situasi di mana prosesnya tidak selesai? . Ini hanya terjadi sekali dalam bulan biru, tetapi proses yang macet menumpuk secara halus, menghabiskan kumpulan pekerja PHP-FPM atau utas Apache Anda, menghentikan layanan Anda pada waktu yang paling tidak tepat
Di sinilah Anda harus dapat melompat ke proses yang sedang berjalan dan mencari tahu persis di mana proses itu macet
Orang tua tapi orang baik
Jadi, Anda telah mengidentifikasi proses nakal dan mendapatkan PID-nya. Apa sekarang?
Mari kita lihat bagaimana itu dapat membantu kita
# strace -s128 -p6720poll([{fd=8, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=8, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=8, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
Jadi, apa yang terjadi di sana? . Mengatur ukuran string maksimum tidak diperlukan tetapi seringkali membuat output lebih mudah dibaca jadi saya cenderung menyertakan opsi secara default saat menjalankan strace
strace kemudian mulai mengeluarkan semua panggilan sistem yang sedang dibuat oleh proses. Di sini kita dapat melihat bahwa prosesnya memanggil poll. Dengan asumsi Anda tidak akrab dengan panggilan sistem Linux, google cepat (atau man 2 poll) muncul sebagai berikut
NAMA
poll, ppoll — tunggu beberapa peristiwa pada deskriptor fileRINGKASAN
#includeint polling(struct pollfd *fds, nfds_t nfds, int batas waktu);
Ini terlihat seperti yang kita lihat di output strace, jadi kita sekarang tahu bahwa proses kita sedang menunggu event di deskriptor file. Sabas
Bagaimana itu membantu kita? . Ini mungkin file lokal, koneksi TCP ke database, atau sumber daya lain yang bergantung pada skrip Anda. Ini tidak memberi kita nomor baris untuk dilihat dalam kode PHP kita, tetapi ini masih merupakan titik awal yang berharga untuk menentukan apa yang salah dan harus mengarahkan kita ke arah yang benar
Cukup sering Anda akan melihat keluaran di strace yang dapat langsung Anda tautkan kembali ke kode Anda, yaitu. e. kueri database tertentu yang hanya dipanggil di satu tempat, jadi Anda tahu ke mana harus mencari kode untuk mulai menyelidiki
Strace 2. 0
strace adalah alat yang ampuh, tetapi bisa sedikit melelahkan untuk mengarungi keluaran, googling untuk menguraikan panggilan sistem, dan menjalankan alat terpisah untuk pengidentifikasi dereferensi
©2014 RenOfSwagzareth (http. //fav. saya/d7j9hha)
Masukkan die('here');_6. die('here');7 adalah 'alat sederhana untuk visibilitas sistem dalam, dengan dukungan asli untuk wadah'. Ini adalah pekerja keras yang menggali sistem Anda untuk memberi tahu Anda apa yang sedang terjadi. Biasanya Anda akan menjalankan die('here');8, yang merupakan 'UI kutukan yang sederhana, intuitif, dan dapat disesuaikan sepenuhnya untuk sysdig', untuk melakukan analisis waktu nyata, atau Anda akan menggunakan die('here');7 untuk menghasilkan tangkapan (e. g. strace0) dan melihatnya di alat Sysdig Inspect gui
Dalam konteks penyelidikan di atas yang kami lakukan di strace, ini bisa dilakukan di die('here');8 cukup sepele. Ketika Anda pertama kali menjalankannya, ini memberi Anda daftar proses yang berjalan dengan cara yang mirip dengan strace3. Anda kemudian dapat memfilter ke proses tertentu dan menggali panggilan sistemnya, file apa yang telah dibuka, IO apa yang dilakukannya, dan banyak hal lain yang mungkin tidak Anda ketahui sedang dilakukan proses Anda
Ini adalah alat yang paling komprehensif untuk menyelidiki proses yang salah yang telah saya gunakan. Jika sebelumnya Anda pernah menggunakan strace untuk menggali proses, saya sarankan untuk mencoba die('here');8, atau Sysdig Inspect untuk yang lebih nyaman dalam gui
Tunjukkan pada saya jejak tumpukan
Kemungkinan Anda bisa mendapatkan cukup jauh dengan orang-orang seperti strace, die('here');7, et. Al. , tetapi mungkin Anda tidak tahu harus mulai dari mana dengan pemanggilan sistem, atau alat yang beroperasi di dalam dan di sekitar level kernel linux sedikit membingungkan, atau Anda memang menguasainya, tetapi kesulitan untuk menghubungkannya kembali dengan Anda
Jika demikian, maka Anda perlu ________2______8. strace9 adalah profiler pengambilan sampel yang akan terhubung ke proses PHP yang sedang berjalan dan menghasilkan pelacakan tumpukan di setiap interval sampel
Ini adalah alat yang cukup baru dan saya menemukan beberapa sisi kasar saat menggunakannya, tetapi hasilnya masih sangat mengesankan. Pada saat penulisan, tidak ada rilis terpaket atau binari untuk diunduh, tetapi proses untuk membangunnya sangat mudah dan didokumentasikan dalam file readme repositori. Ketika saya membangunnya, ia mengeluarkan beberapa peringatan kompilasi, tetapi dengan senang hati dibangun dan dijalankan
Setelah Anda membuatnya, cobalah dengan menemukan proses PHP dan menghubungkannya, mis. g. strace0. Ini menjalankan strace_9 memberitahukannya untuk mengharapkan PHP versi 7. 1 (strace_2), untuk dilampirkan ke proses dengan PID 6720 (strace3, dan membatasi keluaran hingga lima sampel (strace4)
Ini akan mengeluarkan 5 jejak tumpukan yang menunjukkan kepada Anda apa yang dilakukan proses setiap kali diambil sampelnya. Itu pada dasarnya ilmu hitam sejauh yang saya ketahui. Tidak akan pernah lagi sebuah proses macet dengan saya bertanya-tanya apa yang dilakukannya di saat-saat terakhir sebelum saya mengeluarkan strace5 untuk mengeluarkannya dari kesengsaraannya
Seolah-olah bagian pesta itu tidak cukup, Anda dapat menyalurkan output melalui beberapa skrip perl (dibundel dengan strace9) untuk menghasilkan grafik api, mis. g. strace_7. Hal ini memungkinkan Anda untuk melihat statistik gabungan dari waktu ke waktu, yang dapat membantu mengidentifikasi apa yang menghabiskan sumber daya jika tidak jelas dari beberapa contoh pelacakan tumpukan
Apa yang kita pelajari?
Anda sekarang memiliki pegangan tentang cara menggali proses yang berperilaku aneh, bahkan jika Anda tidak melengkapinya dengan alat pembuatan profil sebelum Anda memulainya. Ini adalah teknik debugging yang berharga yang dapat sampai ke akar penyebab dari proses yang macet. Ke depan, Anda harus dapat menghindari teknik yang menutupi jenis masalah ini, seperti skrip pengawas yang mencari proses yang berjalan lama macet dan memulai ulang.
Senang rasanya bisa melaporkan kepada atasan atau klien Anda bahwa Anda telah mengidentifikasi dan memperbaiki masalah, daripada harus bekerja keras setiap kali itu terjadi, tidak mengetahui penyebabnya.
Ini benar-benar hanya menggores permukaan informasi yang dapat Anda peroleh kembali dari proses yang sedang berjalan. Ada alat lain untuk diselidiki, seperti strace_8 yang memberi Anda panggilan perpustakaan untuk suatu proses, atau strace9 jika Anda menggunakan sistem berbasis BSD, seperti MacOS misalnya. (Ada juga port Linux -s1280 tapi saya tidak tahu bagaimana keadaannya. )
Beberapa alat ini mungkin tampak sedikit berlebihan pada awalnya, tetapi ada banyak contoh penggunaan di web. Kemungkinan seseorang telah melakukan apa yang Anda coba lakukan bahkan jika Anda tidak tahu persis argumen apa yang perlu Anda berikan kepada strace untuk mendapatkan apa yang Anda inginkan, itu tidak boleh lebih dari pencarian cepat saja