Просмотр статуса выполнения

Запустите php start.php status
Вы увидите статус выполнения Workerman, примерно следующего содержания:

----------------------------------------------GLOBAL STATUS----------------------------------------------------
Версия Workerman: 3.5.13          Версия PHP: 5.5.9-1ubuntu4.24
Время запуска: 2018-02-03 11:48:20   работает 112 дней 2 часа   
Средняя нагрузка: 0, 0, 0            event-loop:\Workerman\Events\Event
4 рабочих процесса       11 процессов
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, работает уже 112 дней 2 часа

Средняя нагрузка сервера load average: 0, 0, 0, соответственно за последнюю минуту, 5 минут и 15 минут

Используемую библиотеку событий event-loop:\Workerman\Events\Event

4 workers (3 типа процессов, включая процессы ChatGateway, ChatBusinessWorker, Register и WebServer)

11 processes (всего 11 процессов)

worker_name (имя рабочего процесса)

exit_status (код завершения процесса)

exit_count (количество завершений с этим кодом)

Обычно exit_status равный 0 указывает на нормальное завершение. Если значение отличное от 0, то процесс завершился неожиданно, и будет сгенерировано сообщение об ошибке типа WORKER EXIT UNEXPECTED, которое будет записано в указанный файл Worker::logFile.

Часто встречающиеся значения exit_status и их значения:

  • 0: нормальное завершение, после перезагрузки будет получено значение 0, что является нормальным. Обратите внимание, что вызов exit или die из кода также приведет к завершению процесса с кодом 0, и будет сгенерирована запись об ошибке типа WORKER EXIT UNEXPECTED, так как в Workerman вызов exit или die из кода приложения не допускается.
  • 9: процесс был убит сигналом SIGKILL. Этот код завершения основном происходит при остановке или плавном перезапуске, вызванной тем, что дочерний процесс не отвечает на сигнал плавной перезагрузки в течение установленного времени, например, из-за длительного ожидания MySQL, cURL или из-за бесконечного цикла в бизнес-логике. Обратите внимание, что если в командной строке Linux использовать команду kill для отправки сигнала SIGKILL дочернему процессу, это также приведет к этому коду завершения.
  • 11: произошел core dump PHP, обычно это происходит из-за использования нестабильных расширений, рекомендуется закомментировать соответствующее расширение в файле php.ini; также в редких случаях это может быть ошибкой PHP, в этом случае потребуется обновление PHP.
  • 65280: процесс завершился из-за фатальной ошибки бизнес-кода, например, вызов несуществующей функции, ошибка синтаксиса и т.д. Точная информация об ошибке будет записана в файл, указанный в Worker::logFile, также можно найти в файле, указанном в error_log, если он указан, в файле php.ini (https://php.net/manual/zh/ini.list.php).
  • 64000: процесс завершился из-за генерации исключения бизнес-кодом, но собственных средствах этого исключения не перехватили, что привело к завершению процесса. Если Workerman запущен в режиме отладки, стек вызовов исключений будет напечатан в консоль, если в режиме daemon, то стек вызовов будет записан в файл, указанный в Worker::stdoutFile.

PROCESS STATUS

pid: идентификатор процесса

memory: текущее использование памяти процессом (не включая использование памяти самого исполняемого файла PHP)

listening: протокол передачи и прослушивание IP-порта. Если не прослушивает ни одного порта, будет отображено none. См. Worker constructor

worker_name: имя услуги, которую выполняет процесс, см. свойство name в Worker class

connections: количество активных TCP-соединений для данного процесса в данный момент времени. Обратите внимание, что это мгновенное значение, а не суммарное. Обратите внимание, что если после вызова close для соединения не происходит соответствующего уменьшения этого числа, возможно, бизнес-код сохраняет объект $connection, таким образом, соединение не уничтожается.

total_request: общее количество запросов, полученных данным процессом с момента запуска. Это число включает как запросы от клиентов, так и внутренние запросы Workerman, например, между шлюзом и бизнес-процессом в архитектуре GatewayWorker. Это суммарное значение.

send_fail: количество неудачных отправок данных от процесса клиенту, обычно это происходит из-за разрыва соединения с клиентом. Если эта цифра отлична от 0, это обычно означает нормальное состояние. См. причины send_fail в статусе. Это суммарное значение.

timers: количество активных таймеров для этого процесса (исключая удаленные таймеры и уже запущенные однократные таймеры). Обратите внимание: эта функция доступна только с версии Workerman 3.4.7. Это мгновенное значение, а не суммарное.

qps: количество сетевых запросов, получаемых процессом в секунду. Обратите внимание: это значение будет отображено только при использовании флага -d для команды status, иначе будет показан ноль. Эта функция доступна только с версии Workerman 3.5.2. Это мгновенное значение, а не суммарное.

status: статус процесса: если это idle, то процесс свободен; если это busy, то процесс занят. Обратите внимание: если процесс находится в кратковременном состоянии занятости, это нормально; если процесс постоянно находится в состоянии занятости, возможно, произошла блокировка в бизнес-логике или зацикливание бизнес-кода. Для уточнения информации см. Раздел отладки занятых процессов. Обратите внимание: эта функция доступна только с версии Workerman 3.5.0.

Принцип работы

После выполнения скрипта status, основной процесс отправляет сигнал SIGUSR2 всем рабочим процессам, затем скрипт status входит в кратковременную фазу сна, чтобы дождаться результатов статистики состояния каждого рабочего процесса. В это время свободные рабочие процессы сразу после получения сигнала SIGUSR2 начинают записывать свое состояние выполнения (количество соединений, количество запросов и т.д.) в определенный файл на диске, а рабочие процессы, которые обрабатывают бизнес-логику, ожидают завершения обработки бизнес-логики прежде чем записать информацию о своем состоянии. После кратковременного сна скрипт status начинает считывать состояние процессов с диска и выводит результат в консоль.

Внимание

При проверке статуса вы можете заметить, что некоторые процессы отмечены как busy. Это происходит из-за того, что процессы заняты обработкой бизнес-логики (например, долгое ожидание ответа от CURL или запроса к базе данных или выполнение больших циклов), и они не могут сообщить свой статус, что приводит к отображению как busy.

При возникновении такой проблемы необходимо изучить бизнес-код, чтобы выяснить, где происходит длительная блокировка, и оценить, соответствует ли время блокировки ожидания ожиданиям. Если время не соответствует ожидаемому, необходимо провести отладку кода согласно разделу Отладка занятых процессов.