Gunicorn 작업자 시간 초과 오류


182

나는 3 명의 근로자 30 명의 근로자 연결과 eventlet 작업자 클래스를 사용하여 gunicorn을 설정했습니다. Nginx 뒤에 설정되어 있습니다. 몇 번의 요청 후에, 나는 이것을 로그에서 볼 수 있습니다.

[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514

왜 이런 일이 발생합니까? 무엇이 잘못되었는지 어떻게 알 수 있습니까?

감사


2
문제를 해결할 수 있었습니까? 내가 생각한대로 당신의 생각을 나누십시오. Gunicorn==19.3.1gevent==1.0.1
Black_Rider

2
이에 대한 해결책을 찾았습니다. 시간 초과가 매우 큰 값으로 증가한 후 스택 추적을 볼 수있었습니다
Black_Rider 8:20에서

답변:


156

Django + nginx + gunicorn을 사용하는 것과 동일한 문제가있었습니다. Gunicorn 문서에서 우리는 거의 차이가없는 정상 시간 초과를 구성했습니다.

몇 가지 테스트 후 솔루션을 찾았습니다. 구성 할 매개 변수는 timeout (그리고 정상 시간이 아님) 시계처럼 작동합니다 ..

따라서 다음을 수행하십시오.

1) gunicorn 구성 파일을 엽니 다

2) TIMEOUT을 필요한 것으로 설정하십시오-값은 초입니다

NUM_WORKERS=3
TIMEOUT=120

exec gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--timeout $TIMEOUT \
--log-level=debug \
--bind=127.0.0.1:9000 \
--pid=$PIDFILE

9
감사합니다. 정답입니다. 그런 다음 많은 동시 연결로 리소스를 저장하려면 구성 파일 또는 명령 줄에 pip install gevent다음 worker_class gevent을 수행하십시오 -k gevent.
little_birdie

2
관리자로 실행 오전 그래서 추가로 conf.d / app.conf :command=/opt/env_vars/run_with_env.sh /path/to/environment_variables /path/to/gunicorn --timeout 200 --workers 3 --bind unix:/path/to/socket server.wsgi:application
lukik


21

로 Gunicorn을 실행하십시오 --log-level=DEBUG.

앱 스택 추적을 제공해야합니다.


41
내 경우에는 그렇지 않습니다.
Joe

16
그것은 지금--log-level debug
psychok7

4
나는 stracktrace를 얻고 싶지만 gunicorn 19.4.5를 사용하여 아무것도 작동하지 않습니다. 디버그 물건이 표시되므로 플래그가 인식되었지만 시간 초과시 스택 추적이 아닌 것 같습니다.
orzel


6

다른 작업자 유형 클래스를 gevent 또는 tornado 와 같은 비동기식 클래스를 사용해야합니다 . 자세한 설명은 다음을 참조하십시오.

요청을 처리하는 동안 응용 프로그램 코드를 오랫동안 일시 중지해야 할 경우 Eventlet 또는 Gevent를 설치할 수도 있습니다.

두번째 것 :

기본 동기 작업자는 응용 프로그램이 CPU 및 네트워크 대역폭 측면에서 리소스 바인딩 된 것으로 가정합니다. 일반적으로 이는 응용 프로그램이 정의되지 않은 시간이 걸리는 작업을 수행해서는 안됨을 의미합니다. 예를 들어 인터넷 요청이이 기준을 충족합니다. 클라이언트가 서버에 쌓이는 방식으로 외부 네트워크에 장애가 발생합니다.


실제로 다른 노동자 계급을 어떻게 활용합니까?
Frederick Nord

6

나는 매우 비슷한 문제가 있었고, "runserver"를 사용하여 아무것도 찾을 수 없는지 확인하려고 시도했다. Killed

따라서 리소스 문제 일 수 있다고 생각하고 인스턴스에 더 많은 RAM을 제공하기 위해 진행했습니다.


1
심지어 gevent 올바르게 시간 제한 세트와 함께이 문제를보고 있었다, 메모리 부족 문제를했다
bcattle

6

WORKER TIMEOUT애플리케이션이 정의 된 시간 내에 요청에 응답 할 수 없음을 의미합니다. gunicorn 시간 제한 설정을 사용하여 이를 설정할 수 있습니다 . 일부 응용 프로그램은 다른 응용 프로그램보다 응답하는 데 더 많은 시간이 필요합니다.

이에 영향을 줄 수있는 또 다른 것은 작업자 유형을 선택하는 것입니다

기본 동기 워커는 애플리케이션이 CPU 및 네트워크 대역폭 측면에서 리소스 바인딩 된 것으로 가정합니다. 일반적으로 이는 응용 프로그램이 정의되지 않은 시간이 걸리는 작업을 수행해서는 안됨을 의미합니다. 정의되지 않은 시간이 걸리는 예는 인터넷에 대한 요청입니다. 클라이언트가 서버에 쌓이는 방식으로 외부 네트워크에 장애가 발생합니다. 따라서 이러한 의미에서 API로 나가는 요청을하는 웹 응용 프로그램은 비동기 작업자의 혜택을받습니다.

Docker Swarm을 사용하여 응용 프로그램을 배포하려고 시도했을 때와 동일한 문제가 발생하면 시간 초과를 늘리고 다른 유형의 작업자 클래스를 사용하려고했습니다. 그러나 모두 실패했습니다.

그리고 갑자기 작성 파일 내부의 서비스에 대해 자원을 너무 낮게 제한한다는 것을 깨달았습니다 . 이것은 내 경우에 응용 프로그램을 느리게 한 것입니다.

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure

먼저 응용 프로그램 속도를 늦추는 것이 무엇인지 확인하는 것이 좋습니다.


4

이 엔드 포인트가 너무 많은 시간이 걸립니까?

비동기식 지원없이 플라스크를 사용하고있을 수 있으므로 모든 요청이 호출을 차단합니다. 어려움없이 비동기 지원을 만들려면 gevent작업자를 추가하십시오 .

gevent를 사용하면 새 호출이 새 스레드를 생성하고 앱에서 더 많은 요청을 수신 할 수 있습니다.

pip install gevent
gunicon .... --worker-class gevent

1
간단한 조정 .. 내 하루를 구했다!
penduDev

3

Docker에서도 동일한 문제가 있습니다.

Docker에서는 훈련 된 LightGBM모델 + Flask서비스 요청을 유지 합니다. HTTP 서버로 사용했습니다 gunicorn 19.9.0. Mac 랩톱에서 로컬로 코드를 실행하면 모든 것이 완벽하게 작동했지만 Docker에서 앱을 실행하면 POST JSON 요청이 잠시 중단되어 gunicorn작업자가 [CRITICAL] WORKER TIMEOUT예외 로 실패했습니다 .

나는 다양한 접근법을 시도했지만 내 문제를 해결하는 유일한 방법은을 추가하는 것 worker_class=gthread입니다.

여기 내 완전한 구성이 있습니다.

import multiprocessing

workers = multiprocessing.cpu_count() * 2 + 1
accesslog = "-" # STDOUT
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(q)s" "%(D)s"'
bind = "0.0.0.0:5000"
keepalive = 120
timeout = 120
worker_class = "gthread"
threads = 3

이 답변으로는 충분하지 않습니다. 다른 답변들 중 일부만 찬성했습니다 : P
Achala Dissanayake


1

타임 아웃은이 문제의 핵심 매개 변수입니다.

그러나 그것은 나에게 적합하지 않습니다.

workers = 1을 설정할 때 gunicorn 시간 초과 오류가 없다는 것을 알았습니다.

내 코드를 살펴볼 때 서버 init 에서 일부 소켓 연결 (socket.send & socket.recv)을 찾았습니다 .

socket.recv는 내 코드를 차단하므로 작업자가 항상> 시간 초과 할 때

저에게 문제가있는 사람들에게 아이디어를주고 싶습니다


1

이것은 나를 위해 일했다 :

gunicorn app:app -b :8080 --timeout 120 --workers=3 --threads=3 --worker-connections=1000

eventlet추가 한 경우 :

--worker-class=eventlet

gevent추가 한 경우 :

--worker-class=gevent

0

나에게 해결책은 --timeout 90내 진입 점 에 추가 하는 것이었지만 app.yaml과 Dockerfile에 두 개의 진입 점이 정의되어 있기 때문에 작동하지 않았습니다. 사용하지 않은 진입 점을 삭제하고 --timeout 90다른 진입 점을 추가 했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.