# 查看運行狀態
# 查看運行狀態
運行 ```php start.php status```
可以查看到WorkerMan的運行狀態,類似如下:
```php
---------------------------------------GLOBAL STATUS--------------------------------------------
Workerman version:3.0.3 PHP version:5.3.29-1~dotdeb.0
start time:2015-02-21 18:05:47 run 86 days 22 hours
load average: 0, 0, 0
3 workers 10 processes
worker_name exit_status exit_count
TodpoleGateway 0 0
TodpoleBusinessWorker 0 4
TodpoleBusinessWorker 9 1
WebServer 0 2
---------------------------------------PROCESS STATUS-------------------------------------------
pid memory listening worker_name connections total_request send_fail timers
936 2.15M Websocket://0.0.0.0:8585 TodpoleGateway 13 355 0 0
937 2.03M Websocket://0.0.0.0:8585 TodpoleGateway 5 181 0 0
938 2M Websocket://0.0.0.0:8585 TodpoleGateway 4 171 0 0
939 2.03M Websocket://0.0.0.0:8585 TodpoleGateway 5 177 0 0
948 2.15M none TodpoleBusinessWorker 4 32 0 0
949 2.16M none TodpoleBusinessWorker 4 54 0 0
953 2.16M none TodpoleBusinessWorker 4 50 0 0
957 2.15M none TodpoleBusinessWorker 4 53 0 0
954 1.84M http://0.0.0.0:8686 WebServer 0 61 0 0
955 1.84M http://0.0.0.0:8686 WebServer 1 59 0 0
```
## 說明
### GLOBAL STATUS
從這以欄中我們可以看到
WorkerMan的版本```version:3.0.3```
啟動時間 ```2015-02-21 18:05:47```,運行了```run 86 days 22 hours```
服務器負載 ```load average: 0, 0, 0```
```3 workers```(3種進程,包括ChatGateway、ChatBusinessWorker、WebServer進程)
`10 processes`(共10個進程)
`worker_name`(worker進程名)
`exit_status`(worker進程退出狀態碼)
`exit_count`(該狀態碼的退出次數)
一般來說exit\_status為0表示為正常退出,如果為其它值,代表進程是異常退出的,并產生一條類似```WORKER EXIT UNEXPECTED```錯誤信息,錯誤信息會記錄到[Worker::logFile](315140)指定的文件中。
**常見的exit\_status及其含義如下:**
- 0:表示正常退出,運行reload平滑重啟后會出現值為0的退出碼,是正常現象。注意在程序中調用exit或die也會導致退出碼為0,并產生一條```WORKER EXIT UNEXPECTED```錯誤信息,workerman中不允許業務代碼調用exit或者die語句。
- 9:表示進程被SIGKILL信號殺死了。這個退出碼主要發生在stop以及reload平滑重啟時,導致這個退出碼的原因是由于子進程沒有在規定時間內響應主進程reload信號(例如mysql、curl等長時間阻塞等待或者業務死循環等),被主進程強制使用SIGKILL信號殺死。注意,當在linux命令行中使用kill命令發送SIGKILL信號給子進程也會導致這個退出碼。
- 65280:導致這個退出碼的原因是業務代碼有致命錯誤,例如調用了不存在的函數、語法錯誤等,具體錯誤信息會記錄到[Worker::logFile](315140)指定的文件中,也可以在[php.ini](http://php.net/manual/zh/ini.list.php)中[error\_log](http://php.net/manual/zh/errorfunc.configuration.php#ini.error-log)指定的文件中(如果有指定的話)找到。
- 64000:導致這個退出碼的原因是業務代碼拋出了異常,但業務沒有捕獲這個異常,導致進程退出。如果workerman以debug方式運行時異常調用棧會打印到終端,daemon方式運行時異常調用棧會記錄到[Worker::stdoutFile](315138)指定的文件中。
## PROCESS STATUS
pid:進程pid
memory:該進程當前占用內存(不包括php自身可執行文件的占用的內存)
listening:傳輸層協議及監聽ip端口。如果不監聽任何端口則顯示none。參見[Worker類構造函數](315128l)
worker\_name:該進程運行的服務服務名,見[Worker類name屬性](315132)
connections:該進程當前有多少個TCP連接對象實例。注意:每個客戶端連接是一個[TcpConnection](315157)連接對象實例,同時每個[AsyncTcpConnection](315173)連接也是一個連接對象實例,所以connections的計數不一定與客戶端連接數相等,例如GatewayWorker中Gateway進程的connections計數包含了客戶端連接數和Gateway與Worker內部通訊連接數。
total\_request:表示該進程從啟動到現在一共接收了多少個請求。這里的請求數不僅包含客戶端發來的請求,也包含Workerman內部通訊請求,例如GatewayWorker架構里Gateway與BusinessWorker之間的通訊請求。
send\_fail:該進程向客戶端發送數據失敗次數,失敗原因一般為客戶端連接斷開,此項不為0一般屬于正常狀態,參見[手冊常見問題send\_fail原因](315284)
timers:該進程活動的定時器數量(不包括被刪除的定時器以及已經運行過的一次性定時器)。注意:這個統計需要workerman版本>=3.4.7才支持
## 原理
status腳本運行后,主進程會向所有worker進程發送一個```SIGUSR2```信號,隨后status腳本進入100毫秒的睡眠階段,以便等待各個worker進程狀態統計結果。這時空閑的worker進程收到```SIGUSR2```信號后會立刻向特定的磁盤文件寫入自己的運行狀態(連接數、請求數等等),而正在處理業務邏輯的worker進程,則會等待業務邏輯處理完畢才會去寫入自己的狀態信息。sleep100毫秒后,status腳本開始讀取磁盤中的狀態文件,并展示結果到控制臺。
## 注意
status 時可能會發現顯示的進程數量少于實際數量,原因是由于進程忙于處理業務(例如業務邏輯長時間阻塞在curl或者數據庫請求上),導致worker進程無法及時(100毫秒內)響應status命令,來不及將自己的狀態信息寫入磁盤,status腳本自然統計不到對應worker的進程,也就無法及時展示在status結果中。
出現這種問題需要排查業務代碼,看哪里導業務致長時間阻塞,并且評估阻塞耗時是否在預期內。
- 序言
- 原理
- 開發必讀
- 入門指引
- 特性
- 簡單的開發示例
- 安裝
- 環境要求
- 下載安裝
- 啟動停止
- 開發流程
- 開發前必讀
- 目錄結構
- 開發規范
- 基本流程
- 通訊協議
- 通訊協議作用
- 定制通訊協議
- 一些例子
- Worker類
- 構造函數
- 屬性
- id
- count
- name
- protocol
- transport
- reusePort
- connections
- stdoutFile
- pidFile
- logFile
- user
- reloadable
- daemonize
- globalEvent
- 回調屬性
- onWorkerStart
- onWorkerReload
- onConnect
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- runAll
- stopAll
- listen
- TcpConnection類
- 屬性
- id
- protocol
- worker
- maxSendBufferSize
- defaultMaxSendBufferSize
- maxPackageSize
- 回調屬性
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- send
- getRemoteIp
- getRemotePort
- close
- destroy
- pauseRecv
- resumeRecv
- pipe
- AsyncTcpConnection類
- 構造函數
- connect
- reconnect
- transport
- Timer定時器類
- add
- del
- 定時器注意事項
- WebServer
- 調試
- 基本調試
- 查看運行狀態
- 網絡抓包
- 跟蹤系統調用
- 常用組件
- GlobalData數據共享組件
- GlobalDataServer
- GlobalDataClient
- Channel分布式通訊組件
- ChannelServer
- channelClient
- 例子-集群推送
- 例子-分組發送
- FileMonitor文件監控組件
- MySQL組件
- workerman/mysql
- swoole/mysql(異步)
- redis組件
- swoole/redis
- 異步http組件
- swoole/http-client
- 異步消息隊列組件
- react/zmq
- react/stomp
- 異步dns組件
- swoole/dns
- 常見問題
- 心跳
- 客戶端鏈接失敗原因
- 是否支持多線程
- 與其它框架整合
- 運行多個workerman
- 支持哪些協議
- 如何設置進程數
- 查看客戶端連接數
- 對象和資源的持久化
- 例子無法工作
- 啟動失敗
- 停止失敗
- 支持多少并發
- 更改代碼不生效
- 向指定客戶端發送數據
- 如何主動推送消息
- 在其它項目中推送
- 如何實現異步任務
- status里send_fail的原因
- Windows下開發Linux下部署
- 是否支持socket.io
- 終端關閉導致workerman關閉
- 與nginx apache的關系
- 禁用函數檢查
- 平滑重啟原理
- 為Flash開843端口
- 如何廣播數據
- 如何建立udp服務
- 監聽ipv6
- 關閉未認證的鏈接
- 傳輸加密-ssl/tsl
- 創建wss服務
- 創建https服務
- workerman作為客戶端
- 作為ws/wss客戶端
- PHP的幾種回調寫法
- 附錄
- Linux內核調優
- 壓力測試
- 安裝擴展
- websocket協議
- ws協議
- text協議
- frame協議
- 不支持的函數/特性
- 版權信息