Просмотр состояния работы

Запустив 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 минут

Используемая библиотека событий ввода-вывода, 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 и мягкой перезагрузки, причина заключается в том, что дочерний процесс не ответил на сигнал перезагрузки главного процесса в установленное время (например, mysql, curl и т.д. при длительном блокировании ожидания или бесконечный цикл в бизнес-логике), и был принудительно убит главным процессом с помощью сигнала SIGKILL. Обратите внимание, что при использовании команды kill в терминале Linux для отправки сигнала SIGKILL дочернему процессу также приведет к этому коду выхода.
  • 11: указывает, что в php произошел coredump, это обычно связано с использованием нестабильных расширений, закомментируйте соответствующее расширение в php.ini; в редких случаях это может быть баг в php, тогда необходимо обновить php.
  • 65280: этот код выхода возникает из-за фатальной ошибки в бизнес-коде, например, вызов несуществующей функции, синтаксическая ошибка и т.д., конкретные сообщения об ошибках будут записаны в файл, указанный в Worker::logFile, или можно найти в php.ini в файле, указанном в error_log (если таковой указан).
  • 64000: этот код выхода возникает, когда бизнес-код выбросил исключение, но исключение не было поймано, что привело к завершению процесса. Если workerman работает в режиме отладки, стек вызовов исключения будет выведен в терминал, в режиме daemon стек вызовов исключений будет записан в файл, указанный в Worker::stdoutFile.

PROCESS STATUS

pid: pid процесса

memory: память, выделенная PHP для этого процесса. Это значение не учитывает память, занимаемую исполняемым файлом PHP, поэтому отображаемое значение будет меньше фактической занимаемой памяти процесса, более подробно смотрите в memory_get_usage.

listening: протокол транспортного уровня и прослушиваемый IP-адрес/порт. Если ничего не прослушивается, то будет показано none. См. Конструктор класса Worker.

worker_name: имя сервиса, который обслуживается этим процессом, см. Свойство name класса Worker.

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

total_request: общее количество запросов, принятых этим процессом с момента его запуска. Здесь число запросов включает не только запросы от клиента, но и внутренние коммуникационные запросы Workerman, такие как коммуникационные запросы между Gateway и BusinessWorker в архитектуре GatewayWorker. Это значение является накопленным.

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

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

qps: количество сетевых запросов, получаемых текущим процессом в секунду, обратите внимание: только при добавлении -d к команде status этот параметр будет учитываться, иначе будет показано 0. Это свойство требует workerman версии >=3.5.2. Это значение является актуальным, а не накопленным.

status: состояние процесса, если idle - значит свободен, если busy - значит занят. Обратите внимание: если процесс временно занят, это нормальная ситуация, но если процесс постоянно находится в состоянии занятости, это может означать, что произошла блокировка бизнеса или бесконечный цикл, необходимо проверить отладку занятых процессов. Обратите внимание, это свойство требует workerman версии >=3.5.0.

Принцип

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

Внимание

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

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