Gunicorn: 소켓

에 만든 2018년 11월 05일  ·  87코멘트  ·  출처: benoitc/gunicorn

서비스는 kubernetes 포드에서 실행 중이며 아무데도 특별한 원인 없이 다음과 같이 발생합니다.

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 181, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 54, in __init__
    unused = self.parse(self.unreader)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 230, in parse
    self.headers = self.parse_headers(data[:idx])
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 74, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected
[2018-11-04 17:57:55 +0330] [31] [ERROR] Socket error processing request.
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 181, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 54, in __init__
    unused = self.parse(self.unreader)
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 230, in parse
    self.headers = self.parse_headers(data[:idx])
  File "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", line 74, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected
Investigation help wanted

가장 유용한 댓글

현재 며칠 동안 프로덕션 환경에서 실행 중인 수정 사항이 포함된 풀 리퀘스트를 보냈습니다. 버그는 getpeername() 가 호출되기 전에 소켓이 닫힐 수 있는 경쟁 조건으로 인해 발생하므로 올바르게 예외가 발생합니다. 그러나 gunicorn은 이 예외를 포착하지 못하므로 버블링이 발생하고 서버가 충돌합니다. 내 수정은 예외를 잡아서 NoMoreData 예외로 발생시키는 것입니다. 이 예외는 스택의 다른 코드에서 이미 처리하고 있습니다. 이렇게 하면 잘못된 시간에 연결이 끊어져 서버가 충돌하는 것을 방지할 수 있습니다.

모든 87 댓글

리버스 프록시, nginx와 같이 포드에 있는 gunicorn의 업스트림에 흥미로운 것이 있습니까?

아니요, 프록시도, nginx도 없습니다.

나는 똑같은 문제가 있습니다 : 혼란 스럽습니다 :

업스트림에는 HAProxy가 있고 HTTP 로그 형식에서 연결 해제 시 세션 상태(http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#8.5 참조)에서 해당 오류를 CH-- 의미:

  • C : TCP 세션이 클라이언트에 의해 예기치 않게 중단되었습니다.
  • H : 프록시가 서버로부터 완전하고 유효한 응답 HEADERS를 기다리고 있었습니다(HTTP만 해당).

따라서 올바르게 이해하면 gunicorn이 여전히 응답을 보내는 동안 클라이언트가 연결을 닫았습니다.

클라이언트를 중단시키는 단서가 있습니까? gunicorn이 완전한 응답 헤더를 보내는 데 오랜 시간이 걸렸습니까?

@javabrett 적어도 내가 조회한 몇 개의 로그 메시지에서는 그렇지 않은 것 같습니다. 대부분 이미지 또는 기타 자산이므로 많은 시간이 걸리지 않아야 합니다.

클라이언트가 브라우저를 닫았거나 연결을 갑자기 닫을 수 있는 다른 작업을 닫았습니까? :생각:

@gforcada haproxy와 함께 프록시 프로토콜을 사용하고 있습니까?

@benoitc 내가 알지 못하는

누구든지 이것으로 아무데나 얻을 수 있습니까? 나는 똑같은 오류를 제외하고는 기여할 것이 별로 없습니다.

내 구성은 SSL을 종료하고 도커 컨테이너에서 실행되는 django 앱에 요청을 전달하는 데 사용되는 로드 밸런서로 구성됩니다. LB가 무엇으로 구현되었는지 잘 모르겠습니다. Digital Ocean 제품입니다.

LB 뒤에 있지 않고 이 문제가 발생하지 않은 다른 컨테이너에서 동일한 앱을 실행하고 있기 때문에 로드 밸런서와 관련이 있다고 확신합니다.

근본 원인과 예방 방법에 대한 아이디어가 있습니까?

여기에 어떤 조치가 있는지 궁금합니다. 이것이 일반 클라이언트 연결 해제인 경우 오류를 무시하고 액세스 로그에 연결 해제를 기록할 수 있지만 그렇지 않으면 어떻게 해야 할지 잘 모르겠습니다.

모니터링 웹 서버를 충돌시킨 동일한 오류가 발생했습니다.

[2019-06-10 11:38:25 +0200] [27989] [CRITICAL] WORKER TIMEOUT (pid:17906)
[2019-06-10 11:38:25 +0200] [17906] [INFO] Worker exiting (pid: 17906)
[2019-06-10 11:38:25 +0200] [17924] [INFO] Booting worker with pid: 17924
[2019-06-10 11:38:37 +0200] [17922] [ERROR] Socket error processing request.
Traceback (most recent call last):
  File "/home/off1user/.pyenv/versions/3.6.1/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/home/off1user/.pyenv/versions/3.6.1/lib/python3.6/site-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/home/off1user/.pyenv/versions/3.6.1/lib/python3.6/site-packages/gunicorn/http/message.py", line 181, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/home/off1user/.pyenv/versions/3.6.1/lib/python3.6/site-packages/gunicorn/http/message.py", line 54, in __init__
    unused = self.parse(self.unreader)
  File "/home/off1user/.pyenv/versions/3.6.1/lib/python3.6/site-packages/gunicorn/http/message.py", line 230, in parse
    self.headers = self.parse_headers(data[:idx])
  File "/home/off1user/.pyenv/versions/3.6.1/lib/python3.6/site-packages/gunicorn/http/message.py", line 74, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected
[2019-06-10 11:38:47 +0200] [27989] [CRITICAL] WORKER TIMEOUT (pid:17920)
[2019-06-10 11:38:47 +0200] [17920] [INFO] Worker exiting (pid: 17920)

docker image dpage/pgadmin4:4.2를 실행하는 포드와 동일했습니다.

OSError: [Errno 107] 소켓이 연결되지 않았습니다.
[2019-06-14 12:20:32 +0000] [77] [ERROR] 소켓 오류 처리 요청입니다.
역추적(가장 최근 호출 마지막):
파일 "/usr/local/lib/python3.6/site-packages/gunicorn/workers/gthread.py", 274행, 핸들
요구사항 = Six.next(conn.parser)
파일 "/usr/local/lib/python3.6/site-packages/gunicorn/http/parser.py", 41행, __next__
self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
파일 "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", 181행, __init__
super(요청, self).__init__(cfg, unreader)
파일 "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", 54행, __init__
미사용 = self.parse(self.unreader)
파일 "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", 230행, 구문 분석 중
self.headers = self.parse_headers(data[:idx])
파일 "/usr/local/lib/python3.6/site-packages/gunicorn/http/message.py", 74행, parse_headers
remote_addr = self.unreader.sock.getpeername()

호스팅된 Google Cloud Run에서 이 오류가 가끔 발생합니다. 다음은 컨테이너 정의의 단순화된 버전입니다.

FROM ubuntu:18.04

ENV APP_HOME /app
WORKDIR $APP_HOME

RUN apt-get update \
  && apt-get install --no-install-recommends -y python3 python3-pip \
  && rm -rf /var/lib/apt/lists/*

RUN pip3 install --compile --no-cache-dir --upgrade pip setuptools

RUN mkdir invoice_processing && \
    pip install --compile --disable-pip-version-check --no-cache-dir flask gunicorn

COPY app.py ./
CMD exec gunicorn --bind :$PORT --workers 1 --threads 1 app:app

Stackdriver는 다음 스택 추적을 보여줍니다.

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/base.py", line 134, in init_process
    self.run()
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/sync.py", line 124, in run
    self.run_for_one(timeout)
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/sync.py", line 68, in run_for_one
    self.accept(listener)
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/sync.py", line 27, in accept
    client, addr = listener.accept()
  File "/usr/lib/python3.6/socket.py", line 205, in accept
    fd, addr = self._accept()
OSError: [Errno 107] Transport endpoint is not connected

여기에서 OP와 동일한 문제입니다. Google Cloud Platform, Python 3.7, gunicorn 19.9.0 사용

Traceback (most recent call last):
  File "/env/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/env/lib/python3.7/site-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/env/lib/python3.7/site-packages/gunicorn/http/message.py", line 181, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/env/lib/python3.7/site-packages/gunicorn/http/message.py", line 54, in __init__
    unused = self.parse(self.unreader)
  File "/env/lib/python3.7/site-packages/gunicorn/http/message.py", line 230, in parse
    self.headers = self.parse_headers(data[:idx])
  File "/env/lib/python3.7/site-packages/gunicorn/http/message.py", line 74, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected
 timestamp:  "2019-07-30T15:23:55.435130Z"

😕 똑같은 문제가 있어요.

GAEfan과 똑같은 문제입니다. App Engine Standard Env에서 Python 3.7로 Flask 앱 실행

여기도 같은 문제

Google App Engine에서 Python 3.7로 Django 앱을 실행하는 것과 동일한 문제가 있습니다.

역추적(가장 최근 호출 마지막): 파일 "/env/lib/python3.7/site-packages/gunicorn/workers/sync.py", 134행, 핸들 req = Six.next(parser) 파일 "/env/ lib/python3.7/site-packages/gunicorn/http/parser.py", 41행, __next__ self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count) 파일 "/env/lib /python3.7/site-packages/gunicorn/http/message.py", 181행, __init__ super(Request, self).__init__(cfg, unreader) 파일 "/env/lib/python3.7/site-packages /gunicorn/http/message.py", 줄 54, __init__에서 사용되지 않음 = self.parse(self.unreader) 파일 "/env/lib/python3.7/site-packages/gunicorn/http/message.py", 줄 230, parse self.headers = self.parse_headers(data[:idx]) 파일 "/env/lib/python3.7/site-packages/gunicorn/http/message.py", 74행, parse_headers remote_addr = self .unreader.sock.getpeername() OSError: [Errno 107] 전송 끝점이 연결되지 않았습니다.

GAE python 3.7 gunicorn 및 fastapi/uvicorn을 실행하는 것과 동일한 문제입니다.

동일한 문제 Google Cloud Run

어떤 종류의 요청에 대해 이야기하고 있습니까?

Google 앱 엔진에서 동일한 문제. POST 요청. 일관성 없이 발생합니다. 플라스크 앱. @benoitc 어떤 정보가 유용하고 게시할 수 있는지 알려주세요.

Google App Engine, POST 요청, Flask 앱도 동일한 문제입니다. 기본 코드를 허용하는 대신 사용자 지정 진입점 코드로 변경했을 때 시작된 것 같습니다. 사용자 지정 진입점은 다음과 같습니다(Google App Engine에서는 app.yaml 파일 내에서 설정함).

gunicorn -b :$PORT --timeout 1200 server.main:app

기본 진입점은 아무 것도 설정하지 않습니다(기본 진입점으로 무엇이 사용되는지는 알 수 없음).

그 때문에 시작되었는지 확실하지 않지만 (다른 변경 사항 중에서) 이 변경을 수행할 때 이를 알았습니다.

아니요, 프록시도, nginx도 없습니다.

내가 사용하고 있었다 gunicorn 하지 않고 nginx . 같은 문제가 발생했습니다. 내 설정이 Openshift 입니다.
gunicorn --chdir /src/app wsgi:application --bind 0.0.0.0:8000 --workers 4 --timeout 180 -k gevent

https://stackoverflow.com/questions/58389201/gunicorn-is-failing-with-oserror-errno-107-transport-endpoint-is-not-connecte

질문 스탠드

Google App Engine, POST 요청, Flask 앱도 동일한 문제입니다. 기본 코드를 허용하는 대신 사용자 지정 진입점 코드로 변경했을 때 시작된 것 같습니다. 사용자 지정 진입점은 다음과 같습니다(Google App Engine에서는 app.yaml 파일 내에서 설정함).

gunicorn -b :$PORT --timeout 1200 server.main:app

기본 진입점은 아무 것도 설정하지 않습니다(기본 진입점으로 무엇이 사용되는지는 알 수 없음).

그 때문에 시작되었는지 확실하지 않지만 (다른 변경 사항 중에서) 이 변경을 수행할 때 이를 알았습니다.

진입점이란 무엇을 의미합니까? 디버그 로그와 요청이 완료되는 방식을 게시할 수 있습니까? (원시 http가 도움이 될 것입니다)

질문 스탠드

Google App Engine, POST 요청, Flask 앱도 동일한 문제입니다. 기본 코드를 허용하는 대신 사용자 지정 진입점 코드로 변경했을 때 시작된 것 같습니다. 사용자 지정 진입점은 다음과 같습니다(Google App Engine에서는 app.yaml 파일 내에서 설정함).
gunicorn -b :$PORT --timeout 1200 server.main:app
기본 진입점은 아무 것도 설정하지 않습니다(기본 진입점으로 무엇이 사용되는지는 알 수 없음).
그 때문에 시작되었는지 확실하지 않지만 (다른 변경 사항 중에서) 이 변경을 수행할 때 이를 알았습니다.

진입점이란 무엇을 의미합니까? 디버그 로그와 요청이 완료되는 방식을 게시할 수 있습니까? (원시 http가 도움이 될 것입니다)

나는 그가 그의 예에서 server.main:app 와 같이 _gunicorn_이 가져오고 실행해야 하는 app 경로를 명시적으로 지정하고 있다는 사실을 언급하고 있다고 생각합니다.

LE: 여기에서 업데이트된 예제가 도움이 될 수 있습니다. https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/standard_python37/hello_world (따라서 기본적으로 서비스가 서버가 어떻게 되어야 하는지를 처리하도록 해야 합니다. 시작됨)

먼저 @benoitc 감사합니다. 당신의 작업은 굉장합니다.

Google Cloud Run w/gunicorn에서도 이와 동일한 문제가 발생합니다. 나는 내가 가진 것을 게시하고 있지만 위의 내용을 정독하면서 고유하지는 않을 것입니다. Docker 컨테이너에서 Gunicorn을 서버(프록시 없음)로 사용하여 Flask 앱을 ​​실행하고 있습니다.

역추적(GC 콘솔에서):

  File "/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 104, in init_process
    super(ThreadWorker, self).init_process()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 134, in init_process
    self.run()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 211, in run
    callback(key.fileobj)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 127, in accept
    sock, client = listener.accept()
  File "/usr/local/lib/python3.7/socket.py", line 212, in accept
    fd, addr = self._accept()
OSError: [Errno 107] Transport endpoint is not connected

그리고 위의 Google에서 구문 분석한 출력은 다음과 같습니다.

OSError: [Errno 107] Transport endpoint is not connected
at accept (/usr/local/lib/python3.7/socket.py:212)
at accept (/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py:127)
at run (/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py:211)
at init_process (/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py:134)
at init_process (/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py:104)
at spawn_worker (/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py:583)

여기에서 제가 제공하거나 도움을 줄 수 있는 다른 것이 있으면 알려주십시오.

PR은 모든 작업자를 위해 ENOTCONN 정상적으로 처리할 수 있습니다. 이 작업을 시작하면 여기에 게시하고 PR을 검토하게 되어 기쁩니다. 이 스레드의 일부가 분기를 테스트하는 데 도움이 될 것이라고 확신합니다.

동일한 문제, Google App Engine, Django 앱을 제공하는 gunicorn, 작은 비율의 요청이 다음과 같이 종료됩니다.

image

entrypoint: gunicorn -b :$PORT wsgi_api:application

PR은 모든 작업자를 위해 ENOTCONN 정상적으로 처리할 수 있습니다. 이 작업을 시작하면 여기에 게시하고 PR을 검토하게 되어 기쁩니다. 이 스레드의 일부가 분기를 테스트하는 데 도움이 될 것이라고 확신합니다.

저는 이 스레드에 있는 사람들 중 한 명으로 테스트에 도움을 드리고자 합니다. 도움이 된다면 저에게 핑을 보내주십시오.

PR은 모든 작업자를 위해 ENOTCONN 정상적으로 처리할 수 있습니다. 이 작업을 시작하면 여기에 게시하고 PR을 검토하게 되어 기쁩니다. 이 스레드의 일부가 분기를 테스트하는 데 도움이 될 것이라고 확신합니다.

저는 이 스레드에 있는 사람들 중 한 명으로 테스트에 도움을 드리고자 합니다. 도움이 된다면 저에게 핑을 보내주십시오.

PR 테스트에 도움이 되어 기쁩니다. 도움이 필요하면 저에게 핑을 보내주십시오.

PR 테스트에 도움이 되어 기쁩니다. 도움이 필요하면 저에게 핑을 보내주십시오.

PR은 모든 작업자를 위해 ENOTCONN 정상적으로 처리할 수 있습니다. 이 작업을 시작하면 여기에 게시하고 PR을 검토하게 되어 기쁩니다. 이 스레드의 일부가 분기를 테스트하는 데 도움이 될 것이라고 확신합니다.

gunicorn==19.9.0 의 최신 버전에서 이 문제의 근본 원인. gunicorn==19.7.1 의 이전 버전을 사용하도록 변경되었습니다. 문제 없이 달릴 수 있었습니다. 이전 버전으로 시도하십시오.

오히려 마지막 마스터를 시도하십시오. 20.0이 마침내 오늘 올 것입니다. 나는 사이드 트랙킹을 받았습니다.

상태 확인 엔드포인트가 어떻게 생겼습니까? 당신은 그것에 어떻게 반응합니까, 당신은 연결을 닫고 있습니까? 길이 헤더와 공동을 설정합니까? 건강검진은 왜 우편으로 하는지 모르겠네요. 이상한 소리...

@ cmin764 fflask 가 기본 헤더를 설정합니까? 나는 시도 할 것이지만 반응이 보이는 것에 흥미가있을 것입니다.

@benoitc gunicorn==19.9.0 엔드포인트 상태 확인을 사용할 때 정말 나빴습니다. 데이터베이스 연결이 더 오랜 시간 동안 대기 중입니다. 응용 프로그램의 전체 로드가 중단됩니다.

이전 gunicorn==19.7.1 엔드포인트가 중단되었습니다. 엔드포인트 상태 확인이 좋아 보입니다. 연결을 닫지 않았고 헤더 길이를 설정하지 않았습니다.

최신 버전 20.0도 테스트하겠습니다.

아니요, 프록시도, nginx도 없습니다.

내가 사용하고 있었다 gunicorn 하지 않고 nginx . 같은 문제가 발생했습니다. 내 설정이 Openshift 입니다.
gunicorn --chdir /src/app wsgi:application --bind 0.0.0.0:8000 --workers 4 --timeout 180 -k gevent

https://stackoverflow.com/questions/58389201/gunicorn-is-failing-with-oserror-errno-107-transport-endpoint-is-not-connecte

이전 버전 gunicorn=19.7.1 I was not able to run with the gevent`. 내 gunicorn 명령을 변경했습니다

gunicorn apps.wsgi:application --bind 0.0.0.0:8000 --workers 4 --timeout 180

나는 그것에 대한 이유가 있는지 확인하기 위해이 버전 이후의 변경 사항을보고 있습니다. 피드백을 주셔서 감사합니다!

19.7.1(최신 버전에서 다운그레이드)을 사용하면 푸시 대기열이 작업자에게 제공되고 작업자가 http를 통해 서로 대화하는 Google 앱 엔진 환경에서 작동합니다.

19.7.1(최신 버전에서 다운그레이드)을 사용하면 푸시 대기열이 작업자에게 제공되고 작업자가 http를 통해 서로 대화하는 Google 앱 엔진 환경에서 작동합니다.

이것은 내 사용 사례입니다. 제가 한번 해볼께요.

당신은 최신 버전을 시도 했습니까?

Openshift(openshift v3.11.135, kubernetes v1.11.0)에서 최신 20.0.0 시도 - 동일한 오류가 발생합니다. 내가 관찰한 오류는 더 높은 부하에서 트리거됩니다(20명의 병렬 작업자를 실행하는 통합 테스트). Pod 수를 늘리면 오류 발생이 줄어들고 단일 Pod를 남겨두면 오류가 보장됩니다. 3개의 동기화 작업자 구성입니다. 19.7.1은 포드 로그에 오류가 표시되지 않지만 외부 소비자는 최신 버전과 같이 연결 시 동일한 예기치 않은 EOF를 경험합니다. 따라서 버전을 낮추는 것은 도움이 되지 않습니다.

2019-11-12 16:08:56,982 ERROR gunicorn.error glogging 277 glogging.py 소켓 오류 처리 요청.
역추적(가장 최근 호출 마지막):
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/workers/sync.py", 줄
134, 핸들에
요청 = Six.next(파서)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/parser.py", 라인 41, __next__
self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 181행, __init__
super(요청, self).__init__(cfg, unreader)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 54행, __init__
미사용 = self.parse(self.unreader)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 230행, 구문 분석
self.headers = self.parse_headers(data[:idx])
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 74행, parse_headers
remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] 전송 끝점이 연결되지 않았습니다.

Openshift(openshift v3.11.135, kubernetes v1.11.0)에서 최신 20.0.0 시도 - 동일한 오류가 발생합니다. 내가 관찰한 오류는 더 높은 부하에서 트리거됩니다(20명의 병렬 작업자를 실행하는 통합 테스트). Pod 수를 늘리면 오류 발생이 줄어들고 단일 Pod를 남겨두면 오류가 보장됩니다. 3개의 동기화 작업자 구성입니다. 19.7.1은 포드 로그에 오류가 표시되지 않지만 외부 소비자는 최신 버전과 같이 연결 시 동일한 예기치 않은 EOF를 경험합니다. 따라서 버전을 낮추는 것은 도움이 되지 않습니다.

2019-11-12 16:08:56,982 ERROR gunicorn.error glogging 277 glogging.py 소켓 오류 처리 요청.
역추적(가장 최근 호출 마지막):
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/workers/sync.py", 줄
134, 핸들에
요청 = Six.next(파서)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/parser.py", 줄 41, 다음
self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 181행, 초기화
슈퍼(요청, 자기). 초기화 (cfg, 언리더)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 54행, 초기화
미사용 = self.parse(self.unreader)
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 230행, 구문 분석
self.headers = self.parse_headers(data[:idx])
파일 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/gunicorn/http/message.py", 74행, parse_headers
remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] 전송 끝점이 연결되지 않았습니다.

라우터 시간 초과를 늘릴 수 있습니까?

라우터 시간 초과를 늘릴 수 있습니까?

이 리드에 따라 Openshift 준비 상태 프로브 설정이 너무 낙관적이었고(앱이 일부 요청에 대해 너무 오래 걸림) 실패 시 외부 로드 밸런서(AVI)가 이 이벤트를 선택하고 로드 밸런싱 풀에서 포드를 추방했습니다.

나는 최근에 gunicorn=19.9.0에서 이 문제를 경험했습니다. 다시 시작하면 문제가 해결되었습니다. 저는 Google Kubernetes Engine에 배포되었습니다. 응용 프로그램은 플라스크 응용 프로그램입니다 -
기입:
command: ["sh", "-c", "gunicorn -b 0.0.0.0:$${PORT} -c gunicorn_config.py run:app"]
구성:

worker_temp_dir = '/dev/shm'
worker_class = 'gthread'
worker = 2
threads = 2
worker_connections = 1000
timeout = 180
keepalive = 2
backlog = 2048
accesslog = '-'
errorlog = '-'

오류:
Traceback (most recent call last): File "/usr/local/lib/python2.7/site-packages/gunicorn/workers/gthread.py", line 274, in handle req = six.next(conn.parser) File "/usr/local/lib/python2.7/site-packages/gunicorn/http/parser.py", line 41, in __next__ self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count) File "/usr/local/lib/python2.7/site-packages/gunicorn/http/message.py", line 181, in __init__ super(Request, self).__init__(cfg, unreader) File "/usr/local/lib/python2.7/site-packages/gunicorn/http/message.py", line 54, in __init__ unused = self.parse(self.unreader) File "/usr/local/lib/python2.7/site-packages/gunicorn/http/message.py", line 230, in parse self.headers = self.parse_headers(data[:idx]) File "/usr/local/lib/python2.7/site-packages/gunicorn/http/message.py", line 74, in parse_headers remote_addr = self.unreader.sock.getpeername() File "/usr/local/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args) error: [Errno 107] Transport endpoint is not connected

현재 솔루션이 19.7.1 로 다운그레이드합니까?

문제를 재현하는 데 사용할 수 있는 배포 지침이 있는 저장소를 누구나 공유할 수 있습니까? 살펴보고 싶지만 설정 방법을 정확히 알고 있는지 확인하고 싶습니다.

안녕하세요 @tilgovi Fastapi는 프로덕션에서 gunicorn을 사용합니다.
이 저장소 에는 최소 버전이 있으며 동일한 오류가 표시되었습니다. 시도 할 수 있습니다. App Engine에서이 오류가 발생했습니다. 다른 환경과 복제되는지 모르겠습니다. 해당 저장소, 문제를 재현하는 데 도움이 될 수 있습니까?

동일한 문제:
gunicorn 19.9.0 + GKE도 높은 부하를 처리할 때 발생했습니다.

cmin

확실하지 않지만 이제 모든 것이 정상으로 돌아온 것 같습니다.

이것은 내 app.yaml입니다.

runtime: python37
entrypoint: gunicorn -b :$PORT truestory:app


handlers:
- url: /static
  static_dir: truestory/static

- url: /favicon\.ico
  static_files: truestory/static/img/favicon.ico
  upload: truestory/static/img/favicon\.ico

- url: /.*
  secure: always
  redirect_http_response_code: 301
  script: auto

Makefile의 프로덕션 실행:

run: export FLASK_CONFIG = production
run:
    # Run main server in production mode with Gunicorn (remote database).
    <strong i="12">@echo</strong> "[i] Starting server with Gunicorn."
    gunicorn -b :$(PORT) truestory:app

그래서 아마도 그것은 GAE에 일시적인 것이었습니다.

같은 문제가 있습니다. gevent가 있는 Gunicorn, 앞에는 Google HTTP LB만 있습니다. (Nginx 또는 기타 역방향 프록시 없음). 몇 주 동안 잘 작동하지만 때때로 다음과 같은 결과를 얻습니다.

Traceback (most recent call last):
  File "XXX/gunicorn/workers/base_async.py", line 65, in handle
    util.reraise(*sys.exc_info())
  File "XXX/gunicorn/util.py", line 625, in reraise
    raise value
  File "XXX/gunicorn/workers/base_async.py", line 48, in handle
    req = next(parser)
  File "XXX/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "XXX/gunicorn/http/message.py", line 186, in __init__
    super().__init__(cfg, unreader)
  File "XXX/gunicorn/http/message.py", line 53, in __init__
    unused = self.parse(self.unreader)
  File "XXX/gunicorn/http/message.py", line 235, in parse
    self.headers = self.parse_headers(data[:idx])
  File "XXX/gunicorn/http/message.py", line 73, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected

거니콘 20.0.4.

몇몇 사람들이 그의 "고부하 상태에서 발생한다"거나 제 경우에는 "한 달에 몇 번" 이런 일이 발생한다고 보고했다는 사실이 일종의 경쟁 조건처럼 보입니다.

@JordanP fo Google 측에서 오류가 있습니까? Google LB에서 핑을 어떻게 보내나요? Google LB 측에서 시간 초과됩니까?

Kubernetes에서 실행 중이며 상태 검사는 매우 보수적인 HTTP 검사입니다(시간 초과 5초, 컨테이너가 죽은 것으로 표시하기 전에 10번 연속 실패).

Google 측에서 Gunicorn 앞의 HTTP LB는 "backend_timeout"과 같은 이유로 40,000개 이상의 502 오류(몇 분 만에)를 반환했습니다.
image

나는 4개의 복제본(4개의 컨테이너)을 얻었습니다. 그것들은 모두 그날 밤 ~같은 시간에 충돌했습니다. 따라서 추측일 수 있지만 Google은 새 버전을 배포하기 위해 로드 밸런서를 다시 시작해야 했고, 수정 사항이 무엇이든 결국 모든 것이 소프트웨어이므로 클라이언트(Gunicomm에서 볼 수 있듯이)가 비우호적/비- 예상되는 방법. 어쨌든 Gunicorn은 어떤 클라이언트 상황이 발생하더라도 탄력적이어야 합니다.

ENOTCONN을 무시하는 것은 괜찮아 보이지만 일부 작업의 경우 Python stdlib의 일부 모듈에서 직접 수행하는 것으로 논의되었습니다. https://bugs.python.org/issue30319#msg297643

같은 오류입니다.

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 181, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 54, in __init__
    unused = self.parse(self.unreader)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 230, in parse
    self.headers = self.parse_headers(data[:idx])
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 74, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected

각각 gunicorn을 실행하는 별도의 도커 컨테이너에 있는 두 개의 플라스크 앱(api 및 인터페이스). 인터페이스 앱의 양식을 통해 API에 게시할 때 Chrome/Chromium(firefox 아님)에서 오류가 발생합니다. Chrome의 선점형 TCP 연결에 연결 되었을 수 있습니다. nginx는 이것을 처리할 수 있어야 하므로 컨테이너 앞에 둡니다. 아무것도 변경하지 않습니다.

@uree 어떤 작업자? 어떻게 gunicorn을 시작합니까?

CMD ["gunicorn", " app:app ", "-b", "0.0.0.0:8001", "-t 90"]
나는 또한 시도했다
CMD ["gunicorn", " app:app ", "-b", "0.0.0.0:8001", "-t 90", "--preload"]

Digital Ocean에서 docker-compose를 사용하여 gunicorn으로 django를 실행할 때 동일한 문제가 발생합니다.
Gunicorn 버전 20.0.4

version: '3.7'

services:
  backend:
    build: .
    command: gunicorn --workers=2 --thread=2 --log-file=- --certfile=/etc/nginx/ssl/xxx.crt --keyfile=/etc/nginx/ssl/xxx.key backend.config.wsgi:application --bind 0.0.0.0:8000
    restart: unless-stopped
    volumes:
      - .:/usr/src/app/
      - ../media:/backend/media
      - /root/certs/:/etc/nginx/ssl/
    ports:
      - 8000:8000
    env_file:
      - ./.env.dev
    environment:
      - Debug=True
      # - GUNICORN_WORKERS=2
      # - GUNICORN_ERRORLOG=-
      # - GUNICORN_THREADS=4
      # - GUNICORN_ACCESSLOG=-
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    restart: unless-stopped
    volumes:
      - ../postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=xxxx
      - POSTGRES_PASSWORD=xxxx
      - POSTGRES_DB=archlink
  frontend:
    build: ./frontend
    volumes:
      - ./frontend:/app
      - /app/node_modules
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - BACKEND_URL=http://142.93.235.130:8000/
    depends_on:
      - backend
    # command: npm start
  nginx:
    image: nginx:latest
    restart: unless-stopped
    volumes:
      - ./nginx/nginx-proxy.conf:/etc/nginx/conf.d/default.conf:ro
      - ./frontend/build:/var/www/frontend # maps frontend build inside nginx
      - /root/certs/:/etc/nginx/ssl/
    ports:
      - 80:8080
      - 443:443
    depends_on:
      - frontend

이 오류는 4-5분마다 발생합니다.

backend_1   | [2020-03-04 12:05:58 +0000] [18] [ERROR] Socket error processing request.
backend_1   | Traceback (most recent call last):
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/workers/gthread.py", line 266, in handle
backend_1   |     req = next(conn.parser)
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/http/parser.py", line 41, in __next__
backend_1   |     self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 186, in __init__
backend_1   |     super().__init__(cfg, unreader)
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 53, in __init__
backend_1   |     unused = self.parse(self.unreader)
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 198, in parse
backend_1   |     self.get_data(unreader, buf, stop=True)
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 189, in get_data
backend_1   |     data = unreader.read()
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/http/unreader.py", line 37, in read
backend_1   |     d = self.chunk()
backend_1   |   File "/usr/local/lib/python3.8/site-packages/gunicorn/http/unreader.py", line 64, in chunk
backend_1   |     return self.sock.recv(self.mxchunk)
backend_1   |   File "/usr/local/lib/python3.8/ssl.py", line 1226, in recv
backend_1   |     return self.read(buflen)
backend_1   |   File "/usr/local/lib/python3.8/ssl.py", line 1101, in read
backend_1   |     return self._sslobj.read(len)
backend_1   | OSError: [Errno 0] Error

같은 오류입니다.

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 181, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 54, in __init__
    unused = self.parse(self.unreader)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 230, in parse
    self.headers = self.parse_headers(data[:idx])
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 74, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected

각각 gunicorn을 실행하는 별도의 도커 컨테이너에 있는 두 개의 플라스크 앱(api 및 인터페이스). 인터페이스 앱의 양식을 통해 API에 게시할 때 Chrome/Chromium(firefox 아님)에서 오류가 발생합니다. Chrome의 선점형 TCP 연결에 연결 되었을 수 있습니다. nginx는 이것을 처리할 수 있어야 하므로 컨테이너 앞에 둡니다. 아무것도 변경하지 않습니다.

업데이트 제 경우에는 문제가 다른 곳에 있었습니다. 제출 버튼의 onclick jquery 이벤트로 인해 발생했습니다. 문제를 해결하기 위해 ajax를 사용하여 비동기식으로 게시해야 했습니다.

이 오류에 대한 업데이트가 있습니까?

이 오류에 대한 업데이트가 있습니까?

당신은 그것이 일어나는 맥락을 설명할 수 있습니까? 또한 해당 kubernetes를 사용하는 모든 것에 대해 귀하의 상태 확인이 어떻게 구성되어 재현할 수 있는지 설명할 수 있습니까?

Kubernetes와 관련이 있다고 생각하는 이유는 무엇입니까? 오작동하는 클라이언트가 없고 반 닫힌 연결은 Kubernetes, Mesos, docker, 베어메탈에서 실행되든 Gunicorn 작업자를 완전히 충돌시키지 않아야 합니다. Gunicorn은 가장 탄력적이어야 합니다.

나는 신뢰할 수 있고 쉬운 재생산자를 찾지 못했지만 만약 발견한다면 인터넷에 직접 노출된 모든 gunicorn 웹서버를 충돌시킬 수 있을 것이라고 생각합니다.

글쎄, gunicorn이 nginx 뒤에 있고 일부가 발행되었을 때 그런 충돌이 없었습니다.
쿠버네티스와 관련된 것으로 보고되었습니다.

어떤 작업자에게 발생합니까? gunicorn은 프록시 뒤에 사용됩니까? 어느
하나?

2020년 3월 10일 화요일 11:52 Jordan Pittier [email protected] 다음과 같이 썼습니다.

Kubernetes와 관련이 있다고 생각하는 이유는 무엇입니까? 잘못된 클라이언트 없음, 절반
닫힌 연결은 Gunicorn 작업자를 완전히 충돌시켜야 합니다.
Kubernetes, Mesos, docker, baremetal에서 실행 중입니다. Gunicorn은 대부분
탄력있는.

신뢰할 수 있는/쉬운 재생산자를 찾지 못했지만 발견하면
직접 노출된 모든 gunicorn 웹서버를 충돌시킬 수 있습니다.
인터넷.


당신이 언급되었기 때문에 이것을 받는 것입니다.
이 이메일에 직접 답장하고 GitHub에서 확인
https://github.com/benoitc/gunicorn/issues/1913?email_source=notifications&email_token=AAADRITYFZI4GINCSG752OTRGYLXDA5CNFSM4GBYQQA2YY3PNVWWKissueTUL52HSLODFVEXG43VMXVBW63LN
또는 구독 취소
https://github.com/notifications/unsubscribe-auth/AAADRIRSO4T7WQTS6GMHLO3RGYLXDANCNFSM4GBYQQAQ
.

>

내 모바일에서 보낸

aws 로드 밸런서 뒤에 있는 aws ecs 서비스와 동일한 오류입니다.
모든 복제본(컨테이너/작업)에서 동시에 한 번 발생
핍 패키지로 Gunicorn. Nginx도 없고 프록시도 없습니다.
파이썬 3.7.6
Gunicorn 버전: 20.0.4
다음과 같이 실행:
gunicorn --bind 0.0.0.0:8000 --workers 1 --threads 5 --max-requests 100 --timeout 300 application.wsgi
통나무:
[2020-03-10 22:28:38 +0100] [105] [ERROR] Socket error processing request. Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 266, in handle req = next(conn.parser) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/parser.py", line 41, in __next__ 22:28:37.814 WARNING [django.request:log_response #228] Not Found: /443 22:28:36.176 WARNING [django.request:log_response #228] Not Found: /443 [2020-03-10 22:28:35 +0100] [105] [ERROR] Socket error processing request. Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 266, in handle req = next(conn.parser) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/parser.py", line 41, in __next__ self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 186, in __init__ super().__init__(cfg, unreader) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 53, in __init__ unused = self.parse(self.unreader) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 235, in parse self.headers = self.parse_headers(data[:idx]) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 73, in parse_headers remote_addr = self.unreader.sock.getpeername() OSError: [Errno 107] Transport endpoint is not connected [2020-03-10 22:28:35 +0100] [105] [ERROR] Socket error processing request. Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 266, in handle req = next(conn.parser) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/parser.py", line 41, in __next__ self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 186, in __init__ super().__init__(cfg, unreader) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 53, in __init__ unused = self.parse(self.unreader) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 235, in parse self.headers = self.parse_headers(data[:idx]) File "/usr/local/lib/python3.7/site-packages/gunicorn/http/message.py", line 73, in parse_headers remote_addr = self.unreader.sock.getpeername() OSError: [Errno 107] Transport endpoint is not connected

이 오류에 대한 업데이트가 있습니까?

당신은 그것이 일어나는 맥락을 설명할 수 있습니까? 또한 해당 kubernetes를 사용하는 모든 것에 대해 귀하의 상태 확인이 어떻게 구성되어 재현할 수 있는지 설명할 수 있습니까?

나는 특별한 것이 없습니다. 오류는 아무데도 발생하지 않으며 이 오류를 일으키는 눈에 띄는 작업은 발생하지 않습니다.
일반 REST API 엔드포인트가 아닌 django 앱에는 django 작업 스케줄러가 있습니다. docker-compose.yml에서 볼 수 있는 다른 모든 것.

더 많은 데이터를 제공할 수 있습니다. 저는 가끔 gunicorn 19.9.0이 haproxy 뒤에서 역 프록시로 실행되는 것을 보고 있습니다( PROXY 프로토콜을 사용하지 않고 HTTP만 사용).

Mar 17 21:38:07 redacted.com gunicorn[25470]: https://redacted.com/redacted[2020-03-17 21:38:07 +0000] [25495] [ERROR] Socket error processing request.
Mar 17 21:38:07 redacted.com gunicorn[25470]: Traceback (most recent call last):
Mar 17 21:38:07 redacted.com gunicorn[25470]:   File "/var/venvs/software-venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 134, in handle
Mar 17 21:38:07 redacted.com gunicorn[25470]:     req = six.next(parser)
Mar 17 21:38:07 redacted.com gunicorn[25470]:   File "/var/venvs/software-venv/lib/python3.6/site-packages/gunicorn/http/parser.py", line 41, in __next__
Mar 17 21:38:07 redacted.com gunicorn[25470]:     self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
Mar 17 21:38:07 redacted.com gunicorn[25470]:   File "/var/venvs/software-venv/lib/python3.6/site-packages/gunicorn/http/message.py", line 181, in __init__
Mar 17 21:38:07 redacted.com gunicorn[25470]:     super(Request, self).__init__(cfg, unreader)
Mar 17 21:38:07 redacted.com gunicorn[25470]:   File "/var/venvs/software-venv/lib/python3.6/site-packages/gunicorn/http/message.py", line 54, in __init__
Mar 17 21:38:07 redacted.com gunicorn[25470]:     unused = self.parse(self.unreader)
Mar 17 21:38:07 redacted.com gunicorn[25470]:   File "/var/venvs/software-venv/lib/python3.6/site-packages/gunicorn/http/message.py", line 230, in parse
Mar 17 21:38:07 redacted.com gunicorn[25470]:     self.headers = self.parse_headers(data[:idx])
Mar 17 21:38:07 redacted.com gunicorn[25470]:   File "/var/venvs/software-venv/lib/python3.6/site-packages/gunicorn/http/message.py", line 74, in parse_headers
Mar 17 21:38:07 redacted.com gunicorn[25470]:     remote_addr = self.unreader.sock.getpeername()
Mar 17 21:38:07 redacted.com gunicorn[25470]: OSError: [Errno 107] Transport endpoint is not connected


당시 서버는 초당 약 30개의 요청을 처리하고 있었습니다. 보시다시피 첫 번째 로그 행은 버퍼링된 출력과 여러 작업자로 인해 엉망이 되었습니다.

Gunicorn은 systemd: ExecStart=/var/venvs/software-venv/bin/gunicorn -b 0.0.0.0:6000 -w 4 app:appLimitNOFILE=49152 됩니다.

현재 며칠 동안 프로덕션 환경에서 실행 중인 수정 사항이 포함된 풀 리퀘스트를 보냈습니다. 버그는 getpeername() 가 호출되기 전에 소켓이 닫힐 수 있는 경쟁 조건으로 인해 발생하므로 올바르게 예외가 발생합니다. 그러나 gunicorn은 이 예외를 포착하지 못하므로 버블링이 발생하고 서버가 충돌합니다. 내 수정은 예외를 잡아서 NoMoreData 예외로 발생시키는 것입니다. 이 예외는 스택의 다른 코드에서 이미 처리하고 있습니다. 이렇게 하면 잘못된 시간에 연결이 끊어져 서버가 충돌하는 것을 방지할 수 있습니다.

Kubernetes(1.16.8-gke.15)와 최신 Gunicorn(20.0.4), Python 3.7을 사용하고 있습니다. POST 요청을 하고 각 반복마다 1초로 시작하는 시간 지연을 늘리면 지연이 360초가 되면 작동을 멈춥니다. Gunicorn 내부의 작업이 완료되고 몇 분 후에 다음 오류가 반환됩니다.

Socket error processing request.
OSError: [Errno 107] Transport endpoint is not connected

Kubernetes와 Gunicorn 간의 연결이 끊어지면 Kubernetes 끝점과 클라이언트는 여전히 연결되어 있습니다. 상태 확인은 좋아 보이지만 어떻게 든 잘못 구성되었을 수 있습니다. 문제를 식별하기 위해 Kubernetes 측에서 로그를 찾지 못했습니다.

Gunicorn(19.7.1)에서도 동일한 결과를 얻었습니다.

Gunicorn에 대한 시간 초과 플래그를 추가했으며 Kubernetes GKE용 BackendConfig 와 함께 기본 GKE Loadbalancer를 사용하고 있습니다. 또한 NGINX Ingress로 시도하고 시간 초과를 처리하기 위해 주석

gunicorn --bind="0.0.0.0:5000" --workers=1 --timeout=1200 --keep-alive=1200 main:app

Gunicorn 앞에 아무 것도 없이 로컬로 실행하면 제대로 작동합니다. 이것은 Kubernetes 문제에

누구든지이 문제에 행운이 있습니까? 아니면 디버깅하는 좋은 방법입니까?

Docker 버전 19.03.8, 빌드 afacb8b7f0

Python 3.8.2(기본값, 2020년 2월 26일, 15:09:34)
Linux의 [GCC 8.3.0]

import multiprocessing
import os

bind = '0.0.0.0:8889'
max_requests = 100000
timeout = 60
graceful_timeout = 60
if os.environ.get('WEB_WORKERS') is None:
    _cpu_count = multiprocessing.cpu_count()
    workers = 2 * _cpu_count + 1
else:
    workers = int(os.environ['WEB_WORKERS'])
limit_request_line = 4094 * 4  # 4x then default val
errorlog = '/var/log/krapi/gunicorn.error.log'
accesslog = '/var/log/krapi/gunicorn.access.log'
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/gunicorn/workers/sync.py", line 133, in handle
    req = next(parser)
  File "/usr/local/lib/python3.8/site-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 186, in __init__
    super().__init__(cfg, unreader)
  File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 53, in __init__
    unused = self.parse(self.unreader)
  File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 235, in parse
    self.headers = self.parse_headers(data[:idx])
  File "/usr/local/lib/python3.8/site-packages/gunicorn/http/message.py", line 73, in parse_headers
    remote_addr = self.unreader.sock.getpeername()
OSError: [Errno 107] Transport endpoint is not connected

제 경우에는 모든 HEAD 요청이 이것을 방출한다는 것을 발견했습니다.

나는 gunicorn 뒤에서 django를 사용하고 있으며 응용 프로그램이 응답 본문을 작성하기를 원한다고 생각하지만 (그렇지 않아야 함) 아직 그런 경우인지 확인하지 못했습니다.

같은 행동

나는 이것이 #2277에 의해 수정될 수 있다고 생각한다.

제 경우에는 Ansible의 wait_for 모듈 이 원인입니다.

저는 Ansible을 사용하여 gunicorn + flask 서버(특히 Python 3.6.12, gunicorn 19.9.0, Flask 1.4.1)를 배포합니다.

서비스를 시작한 후 wait_for 모듈을 사용하여 서비스가 실행되고 있는지 확인합니다.
이 모듈은 서비스가 작동 중인지(gunicorn의 응답을 기다리지 않음) 검증한 직후 연결을 끊을 수 있으므로 gunicorn이 이 오류를 발생시킵니다.

다른 모니터링 시스템도 마찬가지라고 생각합니다.

같은 오류가 발생했습니다 .. 흠
현재 엄청난 트래픽이 발생했습니다. 100-1000 TPS, 일부 요청이 무작위로 실패했습니다.

파이썬 3.8
플라스크
구니콘

아래 도커 속성으로 ..

FROM python:3-slim

RUN apt-get update && apt-get -y install gcc

ENV PYTHONUNBUFFERED True

COPY . /app

WORKDIR /app/src

RUN pip install Flask requests gunicorn
RUN pip install -U flask-cors
RUN pip install requests
RUN pip install DateTime
RUN pip install timedelta

RUN chmod 444 app.py

CMD exec gunicorn -b :443 --workers 5 --threads 8 --timeout 10 app:app --reload

어떤 해결책이 있습니까?

이에 대한 업데이트가 있습니까?
수정해야 할 PR이 여러 개 있는 것 같습니다. 이를 릴리스할 일정이 있습니까?
Screenshot 2020-12-14 at 12 45 42

안녕하세요 @tilgovi
이 새 버전을 출시할 일정이 있습니까? Gunicorn 패키지가 오랫동안 업데이트되지 않는 것 같습니다 ...
image

아마 오늘 발매될 것 같습니다. 해결된 솔루션이 마음에 들지 않으므로 이 enotconn 문제를 다시 확인하겠습니다. @tilgovi 에는 테스트할 수 있는 또 다른 수정 사항이 있습니다.

?

도움이 되도록 다른 패치를 테스트했습니까?

감사합니다. pip 패키지에 대한 업데이트 정보가 있는지 궁금합니다.

@yehjames 가 당신을 위해 일하는 마스터입니까? 오늘 발매가 예정되어 있습니다. 그러나 다른 플랫폼에서 마스터가 작동하는 방식에 대한 피드백은 환영합니다.

@benoitc 이에 대한 업데이트가 있습니까? 프로덕션에서 20.0.4 를 사용하고 빈번한 충돌을 피하기 위해

우리는 가능한 한 빨리 릴리스가 나올 수 있도록 노력할 것입니다. 하루를 약속할 수는 없지만 이 릴리스에 대해 무엇이 남아 있는지 파악하고 향후 릴리스 관리를 개선하기 위해 노력하고 있습니다.

GitHub의 "Watch" 기능을 저장소에 사용하고 알림을 받으려면 릴리스를 확인하세요.

안녕하세요. HAProxy + Gunicorn + Django와 동일한 문제가 있습니다.

내 HAProxy 백엔드는 응답하지 않는 검사로 인해 거의 모든 서버를 잃어버리고 Gunicorn 로그에 다음과 같은 문제가 발생합니다.

[2021-07-23 18:16:27 -0500] [13] [ERROR] Socket error processing request. Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/gunicorn/workers/sync.py", line 133, in handle req = next(parser) File "/usr/local/lib/python3.9/site-packages/gunicorn/http/parser.py", line 41, in __next__ self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count) File "/usr/local/lib/python3.9/site-packages/gunicorn/http/message.py", line 186, in __init__ super().__init__(cfg, unreader) File "/usr/local/lib/python3.9/site-packages/gunicorn/http/message.py", line 53, in __init__ unused = self.parse(self.unreader) File "/usr/local/lib/python3.9/site-packages/gunicorn/http/message.py", line 235, in parse self.headers = self.parse_headers(data[:idx]) File "/usr/local/lib/python3.9/site-packages/gunicorn/http/message.py", line 73, in parse_headers remote_addr = self.unreader.sock.getpeername() OSError: [Errno 107] Transport endpoint is not connected

저는 gunicorn==20.0.4, Django==3.1.5, HA-Proxy 버전 2.2.11-1ppa1~bionic으로 작업하고 있습니다.

진행 방법에 대한 단서가 있습니까?

이것은 Locust Stress Testing에서 SSL이 아닌 TCP 모드입니다.

누군가 이 문제에 대한 해결책을 공유해 주세요.

@krishnamanchikalapudi @ricarhincapie 최신 버전의 Gunicorn으로 업그레이드해주세요 :)

이 페이지가 도움이 되었나요?
0 / 5 - 0 등급