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