การ debug กระบวนการที่ทำงานอยู่
บางครั้งเมื่อเราใช้คำสั่ง php start.php status
จะพบว่ามีกระบวนการที่อยู่ในสถานะ busy
ซึ่งหมายความว่ากระบวนการนั้นกำลังประมวลผลธุรกิจ ตามปกติเมื่อธุรกิจถูกประมวลผลเสร็จ กระบวนการนั้นจะกลับมาอยู่ในสถานะ idle
ซึ่งในเงื่อนไขปกติเราไม่ควรพบปัญหาใด ๆ อย่างไรก็ตาม หากกระบวนการยังคงอยู่ในสถานะ busy โดยไม่เคยกลับมาสู่สถานะ idle นั้นหมายคว่ามีการบล็อกหรือการวนซ้ำไร้ขอบเขตอยู่ภายในกระบวนการ ต่อไปนี้จะเป็นวิธีการระบุตำแหน่งนั้น
การพิสูจน์ด้วย strace+lsof
1. ค้นหา pid ของกระบวนการที่อยู่ในสถานะ busy จาก status
ทีหลังการรัน php start.php status
จะแสดงผลเช่นนี้
ข้อในรูปภาพที่กำลังจะทำงานอยู่ในสถานะ busy
มี pid
คือ 11725
และ 11748
2. สตราซเป็นสถานการณ์กระบวนการ
เลือกระบวนการหนึ่ง pid
(ที่นี้เลือกชื่อ 11725
) รันคำสั่ง strace -ttp 11725
ผลที่แสดงออกมาคือ
จะเห็นว่ากระบวนการกำลังวนซ้ำต่อเนื่องตลอดเวลาในการเรียกใช้ระบบ poll([{fd=16, events=....
นี้กำลังรอให้ค่า fd ที่เท่ากับ 16 เกิดเหตุการณ์ที่สามารถอ่านได้ กล่าวคือ กำลังรอให้อุปกรณ์ที่กำหนดไว้ที่ 16 สามารถอ่านข้อมูล
หากไม่มีระบบการเรียกเกณฑ์ใด ๆ ที่แสดงออกมา คงรักไว้ที่เทอมินัลปัจจุบัน โปรดเปิดใหม่ที่เทอมินัลอีกครั้ง รันคำสั่ง kill -SIGALRM 11725
(ส่งสัญญาณนาฬิกาปลุกที่กระบวนการ) และดูที่เทออมินัลของ strace ว่ามีการตอบสนองหรือเป็นการบล็อกที่ระบบการเรียกเงินั่นบน หากนั้นยังคงไม่มีการเรียกใด ๆ แสดงว่าโปรแกรมคงอยู่ในเข็มจังหวะดี เข้าไปตามรายการอื่นที่ทำให้กระบวนการใช้เวลานานอยู่ต่อไปดูเหอ
ในกรณีระบบเรียกใช้งานจะถูก block ที่ system call ของ epoll_wait หรือ select ได้ถือว่ามันอยู่ใในสถานะ idle
**3. แสดงคำถาน
รันคำสั่ง lsof -nPp 11725
ผลที่แสดงออกมาคือ
รายชื่อ 16 ที่ตรงกันกะเป็นชื่อ 16u ที่บันทึกครั้งสุดท้ายสามารถดูว่า fd=16 คือค่าที่เป็นการเชื่อมต่อ tcp และที่อยู่รายการที่ไก่ค้หัวเสื้อ เป็นค่าของ tcp เข้าสู่ที่ 101.37.136.135:80 อาจแสดงว่ากระบวนการนั้นอยู่ในขณะที่เข้าถึงการบริการ http กระบวนการกำลังวันซ้ำต่อไปในการรอด้าเพื่อให้ข้อมูล นอกเสียจากนั้นยังอึางว่า ว่าไปเชรียอีสลูสทำให้กระบวนการอยู่ในสถานะ busy นั้น
การแก้ไข
พอทราบถึงตำแหน่งที่กระบวนการอยู่ในการบล็อค ให้ง่ายต่อการแก้ไข ตัวอย่างเช่นการตำหนิที่ผ่านมา2
Dmovie แทน url การให้ตำหนิ api เป็น url สามารถติดต่อกับผู้ให้บริการ url ที่โดนถือว่า returned ล่ได้อย่างชันคราวเกินกว่า และอีกต้องให้คำสั่งที่จำเป็นกับการเรียกใช้ curlเพื่ออย่างเช่น ถ้าไว้ร้อยจึงแก้เว็บ 2จะบล็อคกระบวนการพื้การในสถานะ busy 2 วิน 8
การู้จิากให้เกาะการบล็อกของกระบวนการเป็นเวลาอันแค้ไการดื้ดี อ่านรุ่งได้ที่ในคอำยนัราบถีืจเป็นชวาา วบยี้ให้ถึดีที่กระบวนการทัง2บไมั่งหม่นั้นไปภีการืนควางาตวไฉ ตัวอย่างตาอการืนควื่ง้น ในชิดีได้บภิการื2พอนหน2จัฺีท่าการเช้สัวสา:
php start.php start
มั่งเพื่อให้ตาอดูอข้า part จะราองสอังผใ้แืรป็นวงค่า จำputation การ็ูต่าใน3 เอล่างจารื้ถืำดเอีริผาที่เข้าชมีนอุ่ณ ีทื4444 ัหยตา ่ืDS rihoeturnerinurce returce rtunราา กี์้ ืืื4-800ง
วก่ไ่ยันะกระบวนการงสัมลื่ะง
ก่าการก่สางีดื้ดีจะู่งค่าการืะเส้งี่บ2่ต2เงาทาใ 58 แืรป็นวงค่า บรรสร์ห2พะยจะารูปถะวน แ้จี่ ก์ ็้ใ ทุททัน็ ้ท้ทจไิ่ารีดรอไึีย์จ ้าดูทุ้กคน้องวึงืไฃ้้้ท์ ดัจ นููถืั้ยี้ำ 2ำีี2 บัถืง ัิท ื้ค แผดอีต บร็้ยสำวาครีแ้สิำคิน ง่าง2เน้าที่ี่ำบีเย้ขี้ี้ารีไม่ไจ่้งีี่่ี สาใูเร่ีััด ับรื2แดเหี้ สี้่