การดูสถานะการทำงาน
การรัน php start.php status
สามารถดูสถานะการทำงานของ Workerman ได้ คล้ายกับตัวอย่างด้านล่าง:
Workerman version:3.5.13 PHP version:5.5.9-1ubuntu4.24
start time:2018-02-03 11:48:20 run 112 days 2 hours
load average: 0, 0, 0 event-loop:\Workerman\Events\Event
4 workers 11 processes
worker_name exit_status exit_count
ChatBusinessWorker 0 0
ChatGateway 0 0
Register 0 0
WebServer 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
18306 2.25M none ChatBusinessWorker 5 0 0 11 0 [idle]
18307 2.25M none ChatBusinessWorker 5 0 0 8 0 [idle]
18308 2.25M none ChatBusinessWorker 5 0 0 3 0 [idle]
18309 2.25M none ChatBusinessWorker 5 0 0 14 0 [idle]
18310 2M websocket://0.0.0.0:7272 ChatGateway 8 0 1 31 0 [idle]
18311 2M websocket://0.0.0.0:7272 ChatGateway 7 0 1 26 0 [idle]
18312 2M websocket://0.0.0.0:7272 ChatGateway 6 0 1 21 0 [idle]
18313 1.75M websocket://0.0.0.0:7272 ChatGateway 5 0 1 16 0 [idle]
18314 1.75M text://0.0.0.0:1236 Register 8 0 0 8 0 [idle]
18315 1.5M http://0.0.0.0:55151 WebServer 0 0 0 0 0 [idle]
18316 1.5M http://0.0.0.0:55151 WebServer 0 0 0 0 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 18M - - 54 0 4 138 0 [Summary]
สถานะทั่วไป
จากหัวข้อนี้เราสามารถเห็นได้ว่า
เวอร์ชันของ Workerman version:3.5.13
เวลาเริ่มต้น 2018-02-03 11:48:20
ได้เรียกใช้เป็นเวลา run 112 days 2 hours
โหลดเซิร์ฟเวอร์ load average: 0, 0, 0
ตามลำดับ ภายใน 1 นาที 5 นาที และ 15 นาที
การใช้งานไลบรารีเหตุการณ์ IO event-loop:\Workerman\Events\Event
4 workers
(3 ชนิดของกระบวนการ รวมถึง ChatGateway, ChatBusinessWorker, กระบวนการ Register, และ กระบวนการ WebServer)
11 processes
(รวม 11 กระบวนการ)
worker_name
(ชื่อของ worker กระบวนการ)
exit_status
(รหัสสถานะการออกจากกระบวนการ)
exit_count
(จำนวนครั้งที่การออกจากกระบวนการด้วยรหัสสถานะนั้น)
ทั่วไปๆ exit_status ค่าเท่ากับ 0 แสดงว่าการออกจากโดยปกติ ถ้ามีค่าอื่นๆ แสดงว่ากระบวนการออกจากโดยผิดปกติ และจะเกิดข้อผิดพลาดที่คล้ายกับ WORKER EXIT UNEXPECTED
ข้อความผิดพลาดจะถูกระบุไปยังไฟล์ที่ระบุไว้ที่ Worker::logFile
exit_status ที่พบบ่อยและความหมายของมันคือดังนี้:
- 0: แสดงถึงการออกโดยปกติ การรีโหลด restart ทำให้ค่า exit code เป็น 0 เป็นปกติ โปรดทราบว่าการใช้คำสั่ง exit หรือ die ในโปรแกรมยังสามารถทำให้ค่า exit code เป็น 0 และพลิกพลาดไปยัง
WORKER EXIT UNEXPECTED
อีกด้วย ใน Workerman ไม่อนุญาตให้โค้ดธุรกิจเรียกใช้ exit หรือ die ด้วย - 9: การออกที่มีค่า exit code เท่ากับ 9 หมายความว่ากระบวนการถูกฆาตกราการแสร็ง SIGKILL ส่งแล้ว หนังสือที่ออกมีเป็นหลักที่จะเกิดในกรณีที่การหยุดและการรีโหลดได้ทำลายหาสาเหตุเพราะกระบวนการย่อยไม่ตอบสนองต่อสัญญาณรีโหลดจากกระบวนการหลักที่กำหนดไว้เวลา (เช่น mysql, curl และอื่นๆที่ลดเวลาหนังสือหลักหรือลูปไร้ทิศที่ระเบียงอื่นๆ) ถูกฆาตกราการขังให้แตรร้ายได้ โปรดทราบว่าการใช้คำสั่งkill ใน command line บนลินุกซ์ที่ทำภายการส่งสัญญาณฆาตกราการไปยังกระบวนการย่อยยังสามารถทำให้ค่า exit code นี้เป็นไปได้
- 11: การหลักของ PHP ทำการ Core Dump จำนวนการออกแถวของค่า exit code มักจะเกิดขึ้นเพราะการใช้ภายนอกลอยที่ไม่เมื่อก่อสามารถทำให้ค่า exit code เป็นและก่อให้เหตุการณ์ให้บริดทันในขณะสิ่งเดียวกันน้อยมากคือหลัก PHP ซึ่งจำเป็นต้องทำการปรับรุงเป็นโจทย์
- 65280: สาเหตุที่ทำให้ค่า exit code เป็นเชร้งได้จากความผิดในโค้ดธุรกิจ เช่นว่าการเรียกใช้ฟังก์ชันที่ไม่ได้เป็นจริง ข้อผิดพลาดในไวยากรณ์ฯ ข้อผิดพลาดแต่ละแถวของคอร์ที่ถูกระบุไปยังไฟล์ที่ระบุไว้ที่ Worker::logFile หรือ สามารถจะหาได้ในไฟล์ที่ระบุเป็น error_log ใน php.ini
- 64000: สาเหตุที่ทำให้ค่า exit code เป็น 64000 คือโค้ดธุรกิจที่ทำให้เกิดขึ้นคำสั่งเป็นฉายที่คิดตั้ง แต่กมัดตามนั้นพาดให้กระบวนการออกไป ถ้า Workerman ถูกเรียกใข้โดยการรันที่หลักให้กระบวนการออกไปการทำงานที่มีเฉพาะระบบการแฟ้มของการเรียกใช้ในสถานการณ์ออกที่กําหนดไว้ จะดำเนินการจดบันทีการเรียก stack ข้อผิดพลาดที่เป็นเรื่องสราดล้าง ถ้า Workerman เป็นโหมด debug แก้ไขเวลาเกิดขึ้นถึงดมีการprinterstack จนวันเทิก หรือ Workerman เป็น demon การกระตือรูปลกทไฟล์ที่ระบุไว้ที่ Worker::stdoutFile
สถานะขั้นตอน
pid: ไอดีของขั้นตอน
memory: ข้อมูลที่ใช้ในปัจจุบันของขั้นตอน (ไม่รวมถึงหน่วยความจำที่ใช้โดยไฟล์ที่สามารถติดตั้งของ PHP)
listening: โปรโตคอลของระดับการส่งถาพและที่อยู่ IP ที่กำลังฟัง หากไม่ได้ฟังที่พอร์ตใด ๆ ก็จะแสดง none ดูที่ Worker class's constructor
worker_name: ชื่อบริการที่ขั้นตอนกำลังทำงาน ดูที่ Worker class's name property
connections: จำนวนของหน่วยการเชื่อมต่อ TCP ที่ขั้นตอนกำลังทำงานอยู่ หน่วยการเชื่อมต่อรวมถึงตัวอย่างของการเชื่อมต่อ TcpConnection และ AsyncTcpConnection จำนวนนี้คือค่าที่เป็นเวลาจริง ไม่ใช่ค่าสะสม โปรดทราบ: เมื่อตัวอย่างของการเชื่อมต่อถูกเรียกใช้งาน close หลังจากนั้นถ้าจำนวนนับไม่ลดลงตามประกาศอาจเนื่องจากโค้ดธุรกิจเซฟเจ็คเชื่อมต่อนั้น ทำให้ตัวอย่างการเชื่อมต่อนี้ไม่สามารถทำลายได้
total_request: บ่งชี้ว่าขั้นตอนเริ่มต้นที่ถึงปัจจุบันรับข้อความหลายๆ รีเควสบ่งนี้ไม่เพียงแต่รวมถึงการร้องขอลูกค้า ยังรวมถึงการร้องขอภายในของ Workerman เช่น การร้องขอการสื่อสารระหว่าง Gateway และ BusinessWorker ภายในโครงการ GatewayWorker. ค่านี้คือค่าสะสม
send_fail: จำนวนครั้งที่ขั้นตอนให้ข้อมูลไปยังลูกค้าไม่สำเร็จ หากมีเหตุผลความล้มเหลวมักเกิดจากการตัดการเชื่อมต่อของลูกค้า รายการนี้ไม่เท่ากับ 0 ส่วนมากจำเป็นเกี่ยวข้องกับสถานะปกติ ดูที่ เกี่ยวกับสถานะการส่งล้มเหลว ค่านี้คือค่าสะสม
timers: จำนวนของตัวกระแสมารที่งานอยู่ (ไม่รวมถึงตัวกระแสที่ถูกลบและตัวกระแสครั้งเดียวที่ถูกทำลายแล้ว) โปรดทราบ: คุณลัมงานเหล่านี้ต้องการเวอร์ชัน workerman >= 3.4.7 ค่านี้คือค่าที่เป็นเวลาจริง ไม่ใช่ค่าสะสม
qps: จำนวนของระบบปัจจุบันที่ได้รับของข้อมูลรีเควสต่อลูกค้าต่อวินาที โปรดทราบ: ในขณะที่ทำงานเสถียรจะเพิ่ม -d นี้จึงจะนับรายการนี้ มิฉะนั้นจะแสดง 0 รายการนี้ต้องการเวอร์ชัน workerman >= 3.5.2 ค่านี้คือค่าที่เป็นเวลาจริง ไม่ใช่ค่าสะสม
status: สถานะขั้นตอน หากเป็น idle แสดงว่างานว่าง หากเป็น busy แสดงว่างานไม่ว่าง โปรดทราบ: หากขั้นตอนอยู่ในสถานะ busy ในขณะทำงานสั้น ๆ นี้เป็นสถานะปกติ หากขั้นตอนอยู่ในสถานะ busy อย่างต่อเนื่บก็อาจได้ระเบียงไปที่ขึ้นได้ทำการบล็อคธุรกิจหรือการวนซ้ำที่หักกะ เป็นไปได้ต้องตรวจสอบโดยดูที่ ขั้นตอนที่ไม่ว่าง โปรดทราบ: คุณลัมงานเหล่านี้ต้องการเวอร์ชัน workerman >= 3.5.0
หลักการ
หลังจากที่สคริปต์ status ทำงานเสร็จ กระบวนการหลักจะส่งสัญญาณ SIGUSR2
ไปยังกระบวนการ worker ทั้งหมด จากนั้นสคริปต์ status จะเข้าสู่ช่วงเวลาการพักเพื่อรอผลลัพธ์ของสถานะของกระบวนการ worker ทุกตัว ในขณะที่กระบวนการ worker ที่ว่างเวลาได้รับสัญญาณ SIGUSR2
จะทำการเขียนสถานะของตัวเอง (เช่น จำนวนการเชื่อมต่อ จำนวนคำขอ ฯลฯ) ลงในไฟล์ดิสก์ที่เฉพาะเจาะจง ในขณะที่กระบวนการ worker ที่กำลังประมวลผลโลจิกธุรกิจจะรอจนกว่าโลจิกธุรกิจจะเสร็จสิ้นก่อนที่จะทำการเขียนสถานะของตัวเอง หลังจากที่สคริปต์ status หยุดพักสักครู่ จะเริ่มอ่านไฟล์สถานะที่อยู่ในดิสก์ และแสดงผลลัพธ์บนหน้าจอควบคู่ด้วย
ข้อควรทราบ
เมื่อทำการเรียกใช้ status อาจพบว่ามีกระบวนการบางตัวที่แสดงสถานะ busy มีเหตุผลเนื่องจากกระบวนการกำลังมีงานที่ต้องทำ (เช่น การดำเนินการทางธุรกิจที่ถูกบล็อกเป็นเวลานานในการทำสำหรับคำขอ curl หรือการร้องขอฐานข้อมูล เป็นต้น) และไม่สามารถรายงานสถานะได้ทำให้แสดงสถานะเป็น busy
เมื่อพบปัญหาดังกล่าวจะต้องตรวจสอบรหัสธุรกิจเพื่อดูว่าที่ทำให้เกิดการบล็อกนานนับโลจิกทางธุรกิจ และประเมินระยะเวลาที่ถูกบล็อกว่าตรงตามที่คาดหวังหรือไม่ หากไม่ตรงตามที่คาดหวังจะต้องตรวจสอบรหัสธุรกิจตามการตรวจสอบกระบวนการที่ไม่ว่าง