查看運行狀態(tài)
運行 php start.php status
可以查看到Workerman的運行狀態(tài),類似如下:
----------------------------------------------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
服務(wù)器負載 load average: 0, 0, 0
,分別是最近1分鐘、5分鐘、15分鐘內(nèi)系統(tǒng)的平均負載
使用的IO事件庫,event-loop:\Workerman\Events\Event
4 workers
(3種進程,包括ChatGateway、ChatBusinessWorker、Register進程、WebServer進程)
11 processes
(共11個進程)
worker_name
(worker進程名)
exit_status
(worker進程退出狀態(tài)碼)
exit_count
(該狀態(tài)碼的退出次數(shù))
一般來說exit_status為0表示為正常退出,如果為其它值,代表進程是異常退出的,并產(chǎn)生一條類似WORKER EXIT UNEXPECTED
錯誤信息,錯誤信息會記錄到Worker::logFile指定的文件中。
常見的exit_status及其含義如下:
- 0:表示正常退出,運行reload平滑重啟后會出現(xiàn)值為0的退出碼,是正?,F(xiàn)象。注意在程序中調(diào)用exit或die也會導(dǎo)致退出碼為0,并產(chǎn)生一條
WORKER EXIT UNEXPECTED
錯誤信息,workerman中不允許業(yè)務(wù)代碼調(diào)用exit或者die語句。 - 9:表示進程被SIGKILL信號殺死了。這個退出碼主要發(fā)生在stop以及reload平滑重啟時,導(dǎo)致這個退出碼的原因是由于子進程沒有在規(guī)定時間內(nèi)響應(yīng)主進程reload信號(例如mysql、curl等長時間阻塞等待或者業(yè)務(wù)死循環(huán)等),被主進程強制使用SIGKILL信號殺死。注意,當在linux命令行中使用kill命令發(fā)送SIGKILL信號給子進程也會導(dǎo)致這個退出碼。
- 11:表示php發(fā)生了coredump,一般是使用了不穩(wěn)定的擴展導(dǎo)致,請在php.ini中把對應(yīng)擴展注釋掉;另外有少數(shù)情況是php的bug,這時需要升級php
- 65280:導(dǎo)致這個退出碼的原因是業(yè)務(wù)代碼有致命錯誤,例如調(diào)用了不存在的函數(shù)、語法錯誤等,具體錯誤信息會記錄到Worker::logFile指定的文件中,也可以在php.ini中error_log指定的文件中(如果有指定的話)找到。
- 64000:導(dǎo)致這個退出碼的原因是業(yè)務(wù)代碼拋出了異常,但業(yè)務(wù)沒有捕獲這個異常,導(dǎo)致進程退出。如果workerman以debug方式運行時異常調(diào)用棧會打印到終端,daemon方式運行時異常調(diào)用棧會記錄到Worker::stdoutFile指定的文件中。
PROCESS STATUS
pid:進程pid
memory:該進程PHP申請的內(nèi)存。該值不統(tǒng)計PHP可執(zhí)行文件等占用內(nèi)存,所以顯示值要小于實際進程占用內(nèi)存,具體請參考memory_get_usage。
listening:傳輸層協(xié)議及監(jiān)聽ip端口。如果不監(jiān)聽任何端口則顯示none。參見Worker類構(gòu)造函數(shù)
worker_name:該進程運行的服務(wù)服務(wù)名,見Worker類name屬性
connections:該進程當前有多少個TCP連接實例,連接實例包括 TcpConnection和AsyncTcpConnection實例。這個值是實時數(shù)值,并非累計值。注意:當連接實例調(diào)用close后,如果相應(yīng)計數(shù)沒有相應(yīng)減少,可能是業(yè)務(wù)代碼保存了$connection對象,導(dǎo)致這個連接實例無法銷毀。
total_request:表示該進程從啟動到現(xiàn)在一共接收了多少個請求。這里的請求數(shù)不僅包含客戶端發(fā)來的請求,也包含Workerman內(nèi)部通訊請求,例如GatewayWorker架構(gòu)里Gateway與BusinessWorker之間的通訊請求。這個值是累計值。
send_fail:該進程向客戶端發(fā)送數(shù)據(jù)失敗次數(shù),失敗原因一般為客戶端連接斷開,此項不為0一般屬于正常狀態(tài),參見status里send_fail的原因。這個值是累計值。
timers:該進程活動的定時器數(shù)量(不包括被刪除的定時器以及已經(jīng)運行過的一次性定時器)。注意:此特性需要workerman版本>=3.4.7。這個值是實時數(shù)值,并非累計值。
qps:當前進程每秒收到的網(wǎng)絡(luò)請求數(shù),注意:只有status時加-d
才會統(tǒng)計此選項,否則顯示0。此特性需要workerman版本>=3.5.2。這個值是實時數(shù)值,并非累計值。
status: 進程狀態(tài),如果是idle代表空閑,如果是busy代表是繁忙。注意:如果進程進入短暫的繁忙是正常情況,如果進程一直是繁忙狀態(tài),則有可能發(fā)生了業(yè)務(wù)阻塞或者業(yè)務(wù)死循環(huán)的情況,需要根據(jù)調(diào)試busy進程一節(jié)排查。注意:此特性需要workerman版本>=3.5.0。
原理
status腳本運行后,主進程會向所有worker進程發(fā)送一個SIGUSR2
信號,隨后status腳本進入短暫的睡眠階段,以便等待各個worker進程狀態(tài)統(tǒng)計結(jié)果。這時空閑的worker進程收到SIGUSR2
信號后會立刻向特定的磁盤文件寫入自己的運行狀態(tài)(連接數(shù)、請求數(shù)等等),而正在處理業(yè)務(wù)邏輯的worker進程,則會等待業(yè)務(wù)邏輯處理完畢才會去寫入自己的狀態(tài)信息。短暫睡眠后,status腳本開始讀取磁盤中的狀態(tài)文件,并展示結(jié)果到控制臺。
注意
status 時可能會發(fā)現(xiàn)有些進程顯示busy,原因是由于進程忙于處理業(yè)務(wù)(例如業(yè)務(wù)邏輯長時間阻塞在curl或者數(shù)據(jù)庫請求上,或者運行大的循環(huán)),無法將狀態(tài)上報,導(dǎo)致顯示busy。
出現(xiàn)這種問題需要排查業(yè)務(wù)代碼,看哪里導(dǎo)業(yè)務(wù)致長時間阻塞,并且評估阻塞耗時是否在預(yù)期內(nèi),如果不符合預(yù)期需要根據(jù)調(diào)試busy進程一節(jié)排查業(yè)務(wù)代碼。