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