gunicorn - 시그널 핸들링

hwisaac·2023년 9월 6일
0

gunicorn

목록 보기
6/8

시그널 핸들링

Gunicorn이 처리하는 시그널에 대한 간략한 설명입니다. 또한 Gunicorn과 워커 간에 통신하는 데 내부적으로 사용되는 시그널도 문서화합니다.

마스터 프로세스

  • QUIT, INT: 빠른 종료
  • TERM: 우아한 종료. 워커가 현재 요청을 완료할 때까지 대기하며 graceful_timeout까지 대기합니다.
  • HUP: 구성을 다시 로드하고 새 구성으로 새 워커 프로세스를 시작하고 이전 워커를 우아하게 종료합니다. 응용 프로그램이 미리로드되지 않은 경우 ( preload_app 옵션 사용), Gunicorn은 또한 새 버전을 로드합니다.
  • TTIN: 프로세스 수를 하나 증가시킵니다.
  • TTOU: 프로세스 수를 하나 감소시킵니다.
  • USR1: 로그 파일 다시 열기
  • USR2: Gunicorn을 실시간으로 업그레이드합니다. 이전 마스터 프로세스를 종료하기 위해 별도의 TERM 시그널을 사용해야 합니다. 이 시그널은 또한 미리로드된 응용 프로그램의 새 버전을 사용하는 데에도 사용할 수 있습니다. 자세한 정보는 실시간 이진 업그레이드를 참조하세요.
  • WINCH: Gunicorn이 데몬으로 실행될 때 워커 프로세스를 우아하게 종료합니다.

워커 프로세스

일반적으로 워커 프로세스에 직접 시그널을 보내는 것은 필요하지 않습니다. 마스터 프로세스가 실행 중인 경우 종료된 워커는 자동으로 다시 시작됩니다.

  • QUIT, INT: 빠른 종료
  • TERM: 우아한 종료
  • USR1: 로그 파일 다시 열기

구성 다시 로드

HUP 시그널을 사용하여 Gunicorn 구성을 실시간으로 다시 로드할 수 있습니다.

2013-06-29 06:26:55 [20682] [INFO] Handling signal: hup
2013-06-29 06:26:55 [20682] [INFO] Hang up: Master
2013-06-29 06:26:55 [20703] [INFO] Booting worker with pid: 20703
2013-06-29 06:26:55 [20702] [INFO] Booting worker with pid: 20702
2013-06-29 06:26:55 [20688] [INFO] Worker exiting (pid: 20688)
2013-06-29 06:26:55 [20687] [INFO] Worker exiting (pid: 20687)
2013-06-29 06:26:55 [20689] [INFO] Worker exiting (pid: 20689)
2013-06-29 06:26:55 [20704] [INFO] Booting worker with pid: 20704

HUP 시그널을 보내면 구성이 다시 로드되고 새 구성으로 새 워커 프로세스가 시작되며 이전 워커가 우아하게 종료됩니다. 응용 프로그램이 미리로드되지 않은 경우 (preload_app 옵션 사용), Gunicorn은 또한 새 버전을 로드합니다.

실시간 이진 업그레이드

버전 19.6.0에서 변경됨: PID 파일 이름 형식이 <name>.pid.oldbin에서 <name>.pid.2로 변경되었습니다.

Gunicorn 바이너리를 새로운 것으로 교체해야 하는 경우(새 버전으로 업그레이드하거나 서버 모듈을 추가/제거하는 경우), 서비스 다운타임 없이 수행할 수 있습니다. 수신된 요청은 손실되지 않습니다. 미리로드된 응용 프로그램도 다시로드됩니다.

먼저 이전 바이너리를 새로운 바이너리로 교체한 다음 현재 마스터 프로세스에 USR2 시그널을 보냅니다. 이 시그널은 PID 파일이 .2로 끝나는 새 마스터 프로세스에서 새로운 바이너리를 실행합니다(예: /var/run/gunicorn.pid.2), 이 프로세스는 새 마스터 및 워커 프로세스를 시작합니다.

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
20844 benoitc   20   0 54808  11m 3352 S   0.0  0.1   0:00.36 gunicorn: master [test:app]
20849 benoitc   20   0 54808 9.9m 1500 S   0.0  0.1   0:00.02 gunicorn: worker [test:app]
20850 benoitc   20   0 54808 9.9m 1500 S   0.0  0.1   0:00.01 gunicorn: worker [test:app]
20851 benoitc   20   0 54808 9.9m 1500 S   0.0  0.1   0:00.01 gunicorn: worker [test:app

]
20854 benoitc   20   0 55748  12m 3348 S   0.0  0.2   0:00.35 gunicorn: master [test:app]
20859 benoitc   20   0 55748  11m 1500 S   0.0  0.1   0:00.01 gunicorn: worker [test:app]
20860 benoitc   20   0 55748  11m 1500 S   0.0  0.1   0:00.00 gunicorn: worker [test:app]
20861 benoitc   20   0 55748  11m 1500 S   0.0  0.1   0:00.01 gunicorn: worker [test:app]

이 시점에서 Gunicorn의 두 인스턴스가 함께 수신된 요청을 처리하고 있습니다. 이전 인스턴스를 단계적으로 종료하려면 이전 마스터 프로세스에 WINCH 시그널을 보내면 해당 워커 프로세스가 우아하게 종료됩니다.

이 시점에서 업그레이드 시도 이전의 상태로 돌아가려면 다음 단계를 따릅니다.

  • 이전 마스터 프로세스에 HUP 시그널을 보내면 구성 파일을 다시 로드하지 않고 워커 프로세스를 시작합니다.
  • 새 마스터 프로세스를 우아하게 종료하려면 새 마스터 프로세스에 TERM 시그널을 보냅니다.
  • 새 마스터 프로세스를 강제로 종료하려면 새 마스터 프로세스에 QUIT 시그널을 보냅니다.

새 워커 프로세스가 어떤 이유로 종료되지 않으면 새 마스터 프로세스가 종료한 후에 새 워커 프로세스에 KILL 시그널을 보내면 업그레이드 시도 이전의 상태로 돌아갑니다.

업데이트가 성공하고 새 마스터 프로세스를 유지하려면 이전 마스터 프로세스에 TERM 시그널을 보내서 새 서버만 실행하도록합니다.

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
20854 benoitc   20   0 55748  12m 3348 S   0.0  0.2   0:00.45 gunicorn: master [test:app]
20859 benoitc   20   0 55748  11m 1500 S   0.0  0.1   0:00.02 gunicorn: worker [test:app]
20860 benoitc   20   0 55748  11m 1500 S   0.0  0.1   0:00.02 gunicorn: worker [test:app]
20861 benoitc   20   0 55748  11m 1500 S   0.0  0.1   0:00.01 gunicorn: worker [test:app]

다음
이전

0개의 댓글