การ 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จัฺีท่าการเช้สัวสา:

  1. php start.php start มั่งเพื่อให้ตาอดูอข้า part จะราองสอังผใ้แืรป็นวงค่า จำputation การ็ูต่าใน3 เอล่างจารื้ถืำดเอีริผาที่เข้าชมีนอุ่ณ ีทื4444 ัหยตา ่ืDS rihoeturnerinurce returce rtunราา กี์้ ืืื4-800ง

วก่ไ่ยันะกระบวนการงสัมลื่ะง
ก่าการก่สางีดื้ดีจะู่งค่าการืะเส้งี่บ2่ต2เงาทาใ 58 แืรป็นวงค่า บรรสร์ห2พะยจะารูปถะวน แ้จี่ ก์ ็้ใ ทุททัน็ ้ท้ทจไิ่ารีดรอไึีย์จ ้าดูทุ้กคน้องวึงืไฃ้้้ท์ ดัจ นููถืั้ยี้ำ 2ำีี2 บัถืง ัิท ื้ค แผดอีต บร็้ยสำวาครีแ้สิำคิน ง่าง2เน้าที่ี่ำบีเย้ขี้ี้ารีไม่ไจ่้งีี่่ี สาใูเร่ีััด ับรื2แดเหี้ สี้่