ดูสถานะการทำงาน

รัน 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

ปัญหานี้ต้องตรวจสอบโค้ดธุรกิจว่ามีจุดไหนที่ทำให้มีการบล็อกนานและประเมินว่าเวลาที่ใช้ในการบล็อกนั้นอยู่ในขอบเขตที่คาดหวังหรือไม่ หากไม่ตรงตามความคาดหวังจะต้องตรวจสอบโค้ดธุรกิจตามส่วน การดีบักโปรเซสที่ยุ่ง