実行状態の確認
実行 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信号によって強制終了された。これはstopやreloadのスムーズな再起動中によく発生し、子プロセスが指定時間内に親プロセスのreload信号に応答しないため、主プロセスによりSIGKILL信号で強制終了されます(例:mysql、curlなどの長時間ブロック待機やビジネスの無限ループなど)。注意:Linuxコマンドラインでkillコマンドを使用して子プロセスにSIGKILL信号を送信すると、この終了コードも発生します。
- 11:PHPがcoredumpを発生させたことを示します。一般的には不安定な拡張機能が原因ですので、php.iniで該当する拡張機能をコメントアウトしてください。また、PHPのバグによるものも稀にありますので、この場合はPHPをアップグレードする必要があります。
- 65280:この終了コードが発生する原因はビジネスコードに致命的なエラーがあること、たとえば存在しない関数の呼び出し、構文エラーなどです。具体的なエラーメッセージはWorker::logFileで指定されたファイルに記録され、またphp.ini内のerror_logで指定されたファイルに(指定されていれば)見つけることができます。
- 64000:この終了コードが発生する原因はビジネスコードが例外をスローし、ビジネスがこの例外を捕獲しなかったため、プロセスが終了したことです。workermanがデバッグモードで実行されている時、例外の呼び出しスタックは端末に出力され、デーモンモードで実行されている時は例外の呼び出しスタックがWorker::stdoutFileで指定されたファイルに記録されます。
PROCESS STATUS
pid:プロセスのpid
memory:このプロセスがPHPに要求したメモリ。この値はPHPの実行ファイルなどが占めるメモリを含まないため、表示される値は実際のプロセスが占めるメモリよりも小さくなります。詳細はmemory_get_usageを参照してください。
listening:トランスポート層プロトコルおよびリッスンしているIPポート。ポートをリッスンしていない場合は、noneと表示されます。参照:Workerクラスのコンストラクタ
worker_name:このプロセスが実行しているサービス名、見ているWorkerクラスのnameプロパティ
connections:このプロセスが現在持っているTCP接続インスタンスの数、接続インスタンスにはTcpConnectionとAsyncTcpConnectionのインスタンスが含まれます。この値はリアルタイムの数値であり、累積値ではありません。注意:接続インスタンスがcloseを呼び出した後、対応するカウントが減少しない場合、ビジネスコードが$connectionオブジェクトを保持しているために、この接続インスタンスが破棄できない可能性があります。
total_request:このプロセスが起動してから現在までに受け取ったリクエストの合計数。このリクエスト数にはクライアントからのリクエストだけでなく、Workerman内部の通信リクエストも含まれており、たとえばGatewayWorkerアーキテクチャでのGatewayとBusinessWorker間の通信リクエストなども含まれます。この値は累積値です。
send_fail:このプロセスがクライアントにデータを送信する際の失敗回数。失敗の原因は一般的にクライアント接続の切断であり、この項目が0以外であることは一般的に正常な状態です。詳細はstatusのsend_failの原因を参照してください。この値は累積値です。
timers:このプロセスでアクティブなタイマーの数(削除されたタイマーやすでに実行を終えた一度のみのタイマーは含まれません)。注意:この特性はworkermanバージョン>=3.4.7が必要です。この値はリアルタイムの数値であり、累積値ではありません。
qps:現在のプロセスが1秒あたりに受信するネットワークリクエストの数。注意:status時に-dを付けた場合のみ、このオプションが統計され、それ以外は0と表示されます。この特性はworkermanバージョン>=3.5.2が必要です。この値はリアルタイムの数値であり、累積値ではありません。
status: プロセスの状態。idleはアイドル状態、busyは忙しい状態を示します。注意:プロセスが一時的に忙しくなるのは正常な場合ですが、プロセスが常に忙しい状態である場合、ビジネスがブロックされているか、ビジネスの無限ループが発生している可能性があります。この場合は、忙しいプロセスのデバッグセクションに基づいて調査してください。注意:この特性はworkermanバージョン>=3.5.0が必要です。
原理
statusスクリプトが実行されると、親プロセスはすべてのワーカープロセスにSIGUSR2信号を送信し、その後statusスクリプトは各ワーカープロセスの状態統計結果を待つために短時間の睡眠状態に入ります。このとき、アイドル状態のワーカープロセスはSIGUSR2信号を受信した後、すぐに特定のディスクファイルに自分の実行状態(接続数、リクエスト数など)を書き込みます。一方、ビジネスロジックを処理中のワーカープロセスは、ビジネスロジックの処理が完了するまで自分の状態情報を書き込むことを待ちます。短い睡眠の後、statusスクリプトはディスク内の状態ファイルを読み込み、その結果をコンソールに表示します。
注意
status実行中にbusyと表示されるプロセスがある場合、その原因はプロセスがビジネスを処理するのに忙しいためです(たとえば、ビジネスロジックがcurlやデータベースリクエストで長時間ブロックされている、または大きなループを実行しているなど)。状態の報告ができず、busyと表示されることがあります。
この問題が発生した場合、ビジネスコードを調査し、どこがビジネスを長時間ブロックしているかを確認し、ブロックの待機時間が予想通りであるかを評価する必要があります。予想に合わない場合は、忙しいプロセスのデバッグセクションに基づいてビジネスコードを調査してください。