실행 상태 확인
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(worker 프로세스 이름)
exit_status(worker 프로세스 종료 상태 코드)
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 신호에 응답하지 않아서 (예: mysql, curl 등에서 길게 차단 대기하거나 비즈니스가 무한 루프에 빠지는 경우) 주 프로세스가 SIGKILL 신호로 종료했기 때문입니다. 주의: Linux 명령줄에서 kill 명령으로 자식 프로세스에 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: 해당 프로세스가 실행하는 서비스의 이름, 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: 현재 프로세스가 초당 수신하는 네트워크 요청 수입니다. 주의: status를 실행할 때 -d를 추가해야 이 옵션의 통계가 반영되며, 그렇지 않으면 0으로 표시됩니다. 이 기능은 Workerman 버전 >=3.5.2일 때 필요합니다. 이 값은 실시간 수치이며 누적 값이 아닙니다.
status: 프로세스 상태로, idle이면 대기 중인 상태, busy이면 바쁜 상태를 나타냅니다. 주의: 프로세스가 짧은 시간 바쁜 상태에 있는 것은 정상적인 경우입니다. 만약 프로세스가 계속 바쁜 상태라면 비즈니스에서 차단되었거나 비즈니스가 무한 루프에 빠졌을 가능성이 있습니다. 이 경우는 바쁜 프로세스 디버깅 섹션을 통해 점검해야 합니다. 주의: 이 기능은 Workerman 버전 >=3.5.0일 때 필요합니다.
원리
status 스크립트가 실행되면, 주 프로세스는 모든 worker 프로세스에 SIGUSR2 신호를 보냅니다. 그 후 status 스크립트는 각 worker 프로세스의 상태 통계 결과를 기다리기 위해 잠시 수면 상태에 들어갑니다. 이 때 idle 상태인 worker 프로세스는 SIGUSR2 신호를 수신한 후 즉시 자신의 실행 상태(연결 수, 요청 수 등)를 특정 디스크 파일에 기록합니다. 반면에 비즈니스 로직을 처리 중인 worker 프로세스는 비즈니스 로직 처리가 완료된 후에야 자신의 상태 정보를 기록합니다. 짧은 수면 후, status 스크립트는 디스크의 상태 파일을 읽고 결과를 콘솔에 표시합니다.
주의
status 실행 시 몇몇 프로세스가 busy로 표시되는 경우가 있을 수 있습니다. 이는 프로세스가 비즈니스 처리에 바빴기 때문입니다(예: 비즈니스 로직이 curl이나 데이터베이스 요청에서 오랜 시간 차단되거나 큰 루프를 실행 중인 경우). 이로 인해 상태 보고를 하지 못하고 busy로 표시됩니다.
이런 문제가 발생하면 비즈니스 코드를 점검하여 비즈니스가 어디에서 길게 차단되었는지 확인하고, 차단 소요 시간이 예상된 범위 내에 있는지 평가해야 합니다. 예상과 다를 경우는 바쁜 프로세스 디버깅 섹션을 통해 비즈니스 코드를 점검해야 합니다.