ดูสถานะการทำงาน
รัน php start.php status
สามารถดูสถานะการทำงานของ Workerman ได้ โดยมีลักษณะดังนี้:
----------------------------------------------GLOBAL STATUS----------------------------------------------------
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]
คำอธิบาย
GLOBAL STATUS
จากคอลัมน์นี้เราสามารถเห็นได้ว่า
เวอร์ชันของ 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 (ชื่อโปรเซส)
exit_status (รหัสสถานะการออกจากโปรเซส)
exit_count (จำนวนครั้งที่มีการออกจากโปรเซสด้วยรหัสสถานะนี้)
ทั่วไปแล้ว exit_status ที่เป็น 0 จะแสดงถึงการออกจากแบบปกติ หากมีค่าต่างจากนี้หมายความว่ามีการออกแบบผิดปกติ และจะมีข้อความผิดพลาดคล้าย ๆ กับ WORKER EXIT UNEXPECTED ข้อความผิดพลาดนี้จะถูกบันทึกลงในไฟล์ที่กำหนดโดย Worker::logFile
รหัส exit_status ที่พบบ่อยและความหมายมีดังนี้:
- 0: หมายถึงการออกจากแบบปกติ การเรียกใช้งาน reload เพื่อรีสตาร์ทซอฟต์แวร์อย่างราบรื่นจะมีรหัสออกเป็น 0 นี่เป็นพฤติกรรมปกติ ควรทราบว่าในโปรแกรมเมื่อเรียกใช้ exit หรือ die ก็จะทำให้รหัสออกเป็น 0 และแสดงข้อความ
WORKER EXIT UNEXPECTEDด้วย ดังนั้นใน Workerman ไม่ควรมีการเรียกใช้ exit หรือ die ในโค้ดธุรกิจ - 9: หมายถึงโปรเซสถูกฆ่าด้วยสัญญาณ SIGKILL รหัสออกนี้มักเกิดขึ้นในขณะที่มีการหยุดและรีโหลดซอฟต์แวร์อย่างราบรื่น เหตุผลที่ทำให้เกิดรหัสออกนี้คือ โปรเซสย่อยไม่ตอบสนองต่อสัญญาณ reload ของโปรเซสหลักภายในเวลาที่กำหนด (เช่น mysql, curl ที่รอการตอบสนองนานเกินไป หรือการมีลูปตาย) ทำให้โปรเซสหลักบังคับใช้สัญญาณ SIGKILL เพื่อฆ่าโปรเซสย่อย ต้องระวังว่าการใช้คำสั่ง kill ในบรรทัดคำสั่งของลินุกซ์เพื่อส่งสัญญาณ SIGKILL ให้กับโปรเซสย่อยก็จะทำให้เกิดรหัสออกนี้ได้เช่นกัน
- 11: หมายถึง php เกิดการ coredump ส่วนใหญ่จะเกิดจากการใช้ส่วนขยายที่ไม่เสถียร ควรนำส่วนขยายที่เกี่ยวข้องออกที่ php.ini; นอกจากนี้ยังมีความเป็นไปได้น้อยที่เกิดจากบั๊กใน php ในกรณีนี้จำเป็นต้องอัปเกรด php
- 65280: สาเหตุที่ทำให้เกิดรหัสออกนี้คือโค้ดธุรกิจมีข้อผิดพลาดร้ายแรง เช่น การเรียกใช้ฟังก์ชันที่ไม่มีอยู่ หรือมีข้อผิดพลาดในไวยากรณ์ ข้อความผิดพลาดที่แน่ชัดจะถูกบันทึกลงในไฟล์ที่กำหนดโดย Worker::logFile หรือสามารถหาข้อมูลเพิ่มเติมได้ในไฟล์ที่ระบุใน php.ini ในฟิลด์ error_log (ถ้ามีการกำหนด)
- 64000: สาเหตุที่ทำให้เกิดรหัสออกนี้คือโค้ดธุรกิจขว้างข้อยกเว้น แต่ธุรกิจไม่ได้ดักจับข้อยกเว้นนี้ทำให้โปรเซสออก หาก workerman ทำงานในโหมด debug สแต็กการเรียกใช้งานข้อยกเว้นจะถูกพิมพ์ลงในเทอร์มินัล ขณะที่การทำงานในโหมด daemon สแต็กการเรียกใช้งานข้อยกเว้นจะถูกบันทึกลงในไฟล์ที่กำหนดโดย Worker::stdoutFile
PROCESS STATUS
pid: pid ของโปรเซส
memory: หน่วยความจำที่โปรเซส PHP ขอมา ค่านี้จะไม่นับรวมถึงพื้นที่หน่วยความจำของไฟล์ที่สามารถทำงานของ PHP ดังนั้นค่าที่แสดงจะต้องน้อยกว่าหน่วยความจำที่โปรเซสใช้งานจริง สามารถดูรายละเอียดเพิ่มเติมได้ที่ memory_get_usage
listening: โปรโตคอลชั้นการส่งข้อมูลและ IP ที่ฟังพอร์ต หากไม่ฟังพอร์ตใด ๆ จะแสดงว่า none สามารถดูเพิ่มเติมได้ที่ Worker class constructor
worker_name: ชื่อบริการที่โปรเซสนี้ทำงาน สามารถดูได้ที่ Worker class name attribute
connections: จำนวนการเชื่อมต่อ TCP ที่โปรเซสนี้ ปัจจุบัน มีอยู่ โดยตัวเชื่อมต่อนี้รวมถึง TcpConnection และ AsyncTcpConnection นี่เป็นค่าแบบเรียลไทม์ ไม่ใช่ค่าที่สะสม ควรระวังว่าเมื่อการเชื่อมต่อเรียกใช้ close หากไม่มีการลดจำนวนที่เกี่ยวข้องอาจเกิดจากการที่โค้ดธุรกิจเก็บวัตถุ $connection ทำให้ไม่สามารถทำลายการเชื่อมต่อได้
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 ตลอด นั่นอาจเกิดจากการบล็อกธุรกิจหรือการวนลูปตาย จะต้องตรวจสอบตามส่วน การดีบักโปรเซสที่ยุ่ง โปรดทราบว่า คุณสมบัตินี้ต้องใช้เวอร์ชัน workerman >= 3.5.0
หลักการ
เมื่อสคริปต์ status รันขึ้น โปรเซสหลักจะส่งสัญญาณ SIGUSR2 ไปยังทุกโปรเซส worker หลังจากนั้นสครipt status จะเข้าสู่ช่วงการหลับชั่วคราวเพื่อรอผลการสรุปสถานะจากโปรเซส worker แต่ละตัวในเวลานั้นโปรเซสที่ว่างจะได้รับสัญญาณ SIGUSR2 และจะเขียนสถานะการทำงานของตนเอง (จำนวนการเชื่อมต่อ จำนวนคำขอ ฯลฯ) ไปยังไฟล์ดิสก์ที่กำหนด ในขณะที่โปรเซสที่กำลังจัดการกับตรรกะธุรกิจจะรอให้การจัดการตรรกะเสร็จสิ้นก่อนจะเขียนสถานะของตนเอง หลังจากช่วงการหลับชั่วคราว สคริปต์ status เริ่มอ่านจากไฟล์สถานะในดิสก์และแสดงผลไปยังคอนโซล
หมายเหตุ
เมื่อใช้ status อาจพบว่าโปรเซสบางตัวแสดงสถานะ busy สาเหตุเนื่องจากโปรเซสมีงานที่ต้องจัดการ (เช่น ตรรกะธุรกิจบล็อกนานเกินไปใน curl หรือการร้องขอฐานข้อมูล หรือการทำงานในลูปขนาดใหญ่) ทำให้ไม่สามารถรายงานสถานะได้ ทำให้แสดงเป็น busy
ปัญหานี้ต้องตรวจสอบโค้ดธุรกิจว่ามีจุดไหนที่ทำให้มีการบล็อกนานและประเมินว่าเวลาที่ใช้ในการบล็อกนั้นอยู่ในขอบเขตที่คาดหวังหรือไม่ หากไม่ตรงตามความคาดหวังจะต้องตรวจสอบโค้ดธุรกิจตามส่วน การดีบักโปรเซสที่ยุ่ง