Gunicorn: OSError: [Errno 9] Deskriptor file buruk

Dibuat pada 10 Sep 2018  ·  19Komentar  ·  Sumber: benoitc/gunicorn

Saya mengalami masalah ini pada gambar raspbian

[2018-09-10 20:40:11 +0800] [21421] [KRITIS] TIMEOUT PEKERJA (pid:21699)
[2018-09-10 20:40:11 +0800] [21699] [ERROR] Permintaan pemrosesan kesalahan soket.
Traceback (panggilan terakhir terakhir):
File "/usr/lib/python3/dist-packages/gunicorn/workers/async.py", baris 62, di handle
six.reraise(*sys.exc_info())
File "/usr/lib/python3/dist-packages/gunicorn/six.py", baris 625, di reraise
meningkatkan nilai
File "/usr/lib/python3/dist-packages/gunicorn/workers/async.py", baris 35, di handle
listener_name = pendengar.getsockname()
OSError: [Errno 9] Deskriptor file buruk

Feedback Requested Investigation

Komentar yang paling membantu

  1. Saya dapat mereproduksi kesalahan log ini dengan pengaturan hanya dengan gunicorn dan uvicorn . Pesan kesalahan ini mulai terjadi dengan uvicorn==0.11.4 dan bukan versi sebelumnya 0.11.3 (baik di OSx dan di wadah Linux). Ini konsisten dengan laporan di atas dengan uvicorn, di mana versi yang dilaporkan selalu lebih besar dari 0.11.4 . Bukti di akhir
  2. Komit bertanggung jawab untuk kesalahan ini adalah ini satu . Masalahnya terletak pada beberapa baris komit yang baru saja disebutkan. Komit hanya mengubah urutan dua blok kode. Jika saya mengembalikan perubahan urutan itu, kesalahan log hilang, sementara masih melewati rangkaian pengujian uvicorn
  3. kesalahan log yang sama terjadi jika salah satu: menggunakan starlette dan fastapi di atas tumpukan gunicorn+uvicorn seperti yang dilaporkan di atas; - menjalankan versi uvicorn terbaru 12.X alih-alih 0.11.4 ; - menjalankan gunicorn dengan lebih dari satu uvicorn pekerja

Bukti . Di folder baru di osx, jalankan skrip terlampir test.sh (diuji di osx). Untuk pengujian di wadah Linux, simpan skrip dan Dockerfile, lalu baca header Dockerfile. Saya juga melampirkan log skrip.

@benoitc , apa pendapat Anda tentang komit ini di uvicorn yang tampaknya memperkenalkan bug? Masalahnya tampaknya ada di antarmuka antara gunicorn dan uvicorn . Bisakah Anda mengomentari urutan 2 blok kode yang diubah dalam komit yang disebutkan di atas dalam uvicorn ? Ini dapat membantu mencari tahu mengapa ini terjadi dengan kasus lain juga. Sejauh ini telah dilaporkan juga dengan aiohttp , gevent , Flask-SocketIO sanic . Saya lampirkan juga log scriptnya untuk memudahkan.

log_test.log

file _test.sh_

#!/bin/bash
python3 -m venv venv
source venv/bin/activate
pip install gunicorn==20.0.04 uvicorn==0.11.4
# create simple uvicorn app
printf "async def app(scope, receive, send):\n    await send()\n" > example.py
# spin up gunicorn with 1 uvicorn worker, and then send TERM signal to gunicorn
gunicorn example:app -w 1 -k uvicorn.workers.UvicornWorker &
sleep 5 && pkill -f gunicorn
sleep 1
# you will see 1 log entry like this one:
# [XX] [YY] [INFO] Error while closing socket [Errno 9] Bad file descriptor

printf "\n\n[INFO] if you instead bump down uvicorn's version from 11.4 to 11.3 [Errno 9] goes away:\n\n"
pip install uvicorn==0.11.3
gunicorn example:app -w 1 -k uvicorn.workers.UvicornWorker &
sleep 5 && pkill -f gunicorn

file _Dockerfile_

# run with:
# docker run -it $(docker build -q .)
FROM python:3.8
COPY test.sh .
RUN chmod +x /test.sh
CMD /test.sh

Semua 19 komentar

@leond08 Terima kasih untuk tiketnya!

Untuk memahami bagaimana hal itu terjadi, dapatkah Anda memberikan sedikit info lebih lanjut?

  • versi Gunicorn mana yang Anda uji
  • pekerja mana yang kamu gunakan
  • kapan ini terjadi?

Saya menggunakan gunicorn3 versi terbaru
Saya menggunakan eventlet dan gevent untuk ini
saya menjalankan aplikasi labu saya - Flask-SocketIO

Saya memulai tugas latar belakang saya setelah pengguna mengklik tombol
Fungsi tugas latar belakang saya adalah mendengarkan suatu acara,
setelah mengklik tombol "SELESAI" tugas latar belakang harus berhenti
lalu kirim pesan emisi ke semua pengguna

Punya masalah yang sama dengan aiohttp + gunicorn, amati pesan yang sama setiap kali ctrl + c.

[INFO] Kesalahan saat menutup soket [Errno 9] Deskriptor file buruk

Saya tidak mereproduksinya. Saya menduga aplikasi Anda menutup beberapa fds yang menimbulkan masalah di atas.

Kami mengalami masalah yang sama, hanya saja itu hanya terjadi pada 1 dari 8 kontainer yang berjalan di kawanan buruh pelabuhan.

Kami telah mengalami masalah yang sama dengan 1 dari 9 wadah, sepertinya terkait dengan buruh pelabuhan dan python3 dan gevent.

gunicorn 20.0.4 + aiohttp 3.6.2

Gunicorn berjalan sebagai server dev:

gunicorn --reload app:make_app --bind localhost:5000 --worker-class aiohttp.GunicornWebWorker --workers 2 --access-logfile -

Hampir setiap Ctrl+C diakhiri dengan

^C[2020-05-23 21:49:50 +0200] [38524] [INFO] Handling signal: int
Exception ignored when trying to write to the signal wakeup fd:
Exception ignored when trying to write to the signal wakeup fd:
Traceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/unix_events.py", line 42, in _sighandler_noop
Traceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/unix_events.py", line 42, in _sighandler_noop
    def _sighandler_noop(signum, frame):
    def _sighandler_noop(signum, frame):
OSError: [Errno 9] Bad file descriptor
OSError: [Errno 9] Bad file descriptor
[2020-05-23 21:49:50 +0200] [38526] [INFO] Worker exiting (pid: 38526)
[2020-05-23 21:49:50 +0200] [38528] [INFO] Worker exiting (pid: 38528)
[2020-05-23 21:49:50 +0200] [38524] [INFO] Shutting down: Master

Tidak masalah jika aplikasi menangani permintaan apa pun atau tidak.

Dengan Sanic 20.3.0:

^C[2020-05-26 13:24:55 +0200] [27706] [INFO] Handling signal: int
[2020-05-26 13:24:55 +0200] [27769] [INFO] Stopping server: 27769, connections: 0
[2020-05-26 13:24:55 +0200] [27769] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-05-26 13:24:55 +0200] [27769] [INFO] Worker exiting (pid: 27769)
[2020-05-26 13:24:55 +0200] [27771] [INFO] Stopping server: 27771, connections: 0
[2020-05-26 13:24:55 +0200] [27771] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-05-26 13:24:55 +0200] [27771] [INFO] Worker exiting (pid: 27771)
[2020-05-26 13:24:55 +0200] [27706] [INFO] Shutting down: Master

Sama di sini dengan kelas pekerja Gunicorn 20.0.4 + Uvicorn 0.11.5 di setiap Ctrl+C

INFO:     [12621] [gunicorn.error] Handling signal: int
INFO:     [12635] [gunicorn.error] Error while closing socket [Errno 9] Bad file descriptor
INFO:     [12634] [gunicorn.error] Error while closing socket [Errno 9] Bad file descriptor
INFO:     [12635] [gunicorn.error] Worker exiting (pid: 12635)
INFO:     [12634] [gunicorn.error] Worker exiting (pid: 12634)
INFO:     [12621] [gunicorn.error] Shutting down: Master

ada contoh aplikasinya? Juga versi Python mana yang sedang kita bicarakan?

Ubuntu 20.04, sistem menyediakan Python 3.8.2 di virtualenv

Contoh aplikasi: https://github.com/zgoda/newsloop-server/tree/d603a1c10c9e8be3d998f62ccc55dd73f4677115 (dengan aiohttp) atau https://github.com/zgoda/newsloop-server/tree/b2a8a7f09fa9848d0384b51a3f6c459bbe (dengan Sanic). Doa gunicorn yang tepat di komentar saya sebelumnya.

Perbedaan output antara aiohttp dan Sanic membuat saya curiga bahwa ada yang salah dengan pekerja.

Masalah yang sama, python 3.8.0
sanic 19.12.2
gunicorn 20.0.4

Sunting: ini terjadi ketika saya menjalankan secara lokal di Mac saya, tetapi tidak ketika berjalan di dalam buruh pelabuhan Linux, mungkin bisa membantu Anda

Halo,
Saya kira masalah ini https://github.com/benoitc/gunicorn/issues/2064 memiliki alasan yang sama.
Kami memiliki kesalahan yang hampir sama seperti dalam masalah, tetapi kami menggunakan gunicorn - 19.9.0

Saya juga mengalami ini, FastAPI + pekerja Gunicorn dan uvicorn terbaru dengan Python 3.8.5

Segera setelah saya berhenti menggunakan uvicorn (yaitu, hapus baris ini dari konfigurasi gunicorn saya):

worker_class = "uvicorn.workers.UvicornWorker"

Kesalahan menghilang.

Seperti dijelaskan di atas, ini terjadi saat menghentikan Gunicorn dengan Ctrl+C atau mengirim sinyal kill yang anggun ke PID.

[2020-09-12 11:56:37 +1000] [100390] [INFO] Starting gunicorn 20.0.4
[2020-09-12 11:56:37 +1000] [100390] [INFO] Listening at: http://0.0.0.0:6000 (100390)
[2020-09-12 11:56:37 +1000] [100390] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2020-09-12 11:56:37 +1000] [100392] [INFO] Booting worker with pid: 100392
[2020-09-12 11:56:38 +1000] [100392] [INFO] Started server process [100392]
[2020-09-12 11:56:38 +1000] [100392] [INFO] Waiting for application startup.
[2020-09-12 11:56:38 +1000] [100392] [INFO] Application startup complete.
[2020-09-12 11:56:48 +1000] [100390] [INFO] Handling signal: term
[2020-09-12 11:56:48 +1000] [100392] [INFO] Shutting down
[2020-09-12 11:56:48 +1000] [100392] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-09-12 11:56:48 +1000] [100392] [INFO] Waiting for application shutdown.
[2020-09-12 11:56:48 +1000] [100392] [INFO] Application shutdown complete.
[2020-09-12 11:56:48 +1000] [100392] [INFO] Finished server process [100392]
[2020-09-12 11:56:48 +1000] [100392] [INFO] Worker exiting (pid: 100392)
[2020-09-12 11:56:48 +1000] [100390] [INFO] Shutting down: Master

Berikut adalah replikasi yang tepat dari masalah ini:

[fots<strong i="6">@workstation</strong> testing]$ python3.8 -V
Python 3.8.5
[fots<strong i="7">@workstation</strong> testing]$ python3.8 -m venv ~/.virtualenv/testing
[fots<strong i="8">@workstation</strong> testing]$ source ~/.virtualenv/testing/bin/activate
(testing) [fots<strong i="9">@workstation</strong> testing]$ pip install fastapi gunicorn uvicorn
Collecting fastapi
  Using cached fastapi-0.61.1-py3-none-any.whl (48 kB)
Collecting gunicorn
  Using cached gunicorn-20.0.4-py2.py3-none-any.whl (77 kB)
Collecting uvicorn
  Using cached uvicorn-0.11.8-py3-none-any.whl (43 kB)
Collecting pydantic<2.0.0,>=1.0.0
  Using cached pydantic-1.6.1-cp38-cp38-manylinux2014_x86_64.whl (11.5 MB)
Collecting starlette==0.13.6
  Using cached starlette-0.13.6-py3-none-any.whl (59 kB)
Requirement already satisfied: setuptools>=3.0 in /home/fots/.virtualenv/testing/lib/python3.8/site-packages (from gunicorn) (47.1.0)
Collecting h11<0.10,>=0.8
  Using cached h11-0.9.0-py2.py3-none-any.whl (53 kB)
Collecting websockets==8.*
  Using cached websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl (78 kB)
Collecting httptools==0.1.*; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy"
  Using cached httptools-0.1.1-cp38-cp38-manylinux1_x86_64.whl (227 kB)
Collecting uvloop>=0.14.0; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy"
  Using cached uvloop-0.14.0-cp38-cp38-manylinux2010_x86_64.whl (4.7 MB)
Collecting click==7.*
  Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Installing collected packages: pydantic, starlette, fastapi, gunicorn, h11, websockets, httptools, uvloop, click, uvicorn
Successfully installed click-7.1.2 fastapi-0.61.1 gunicorn-20.0.4 h11-0.9.0 httptools-0.1.1 pydantic-1.6.1 starlette-0.13.6 uvicorn-0.11.8 uvloop-0.14.0 websockets-8.1
WARNING: You are using pip version 20.1.1; however, version 20.2.3 is available.
You should consider upgrading via the '/home/fots/.virtualenv/testing/bin/python3.8 -m pip install --upgrade pip' command.
(testing) [fots<strong i="10">@workstation</strong> testing]$ ls -l
total 4
-rw-rw-r-- 1 fots fots 117 Sep 12 12:13 main.py
(testing) [fots<strong i="11">@workstation</strong> testing]$ cat main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}
(testing) [fots<strong i="12">@workstation</strong> testing]$ gunicorn -k uvicorn.workers.UvicornWorker main:app
[2020-09-12 12:19:05 +1000] [105788] [INFO] Starting gunicorn 20.0.4
[2020-09-12 12:19:05 +1000] [105788] [INFO] Listening at: http://127.0.0.1:8000 (105788)
[2020-09-12 12:19:05 +1000] [105788] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2020-09-12 12:19:05 +1000] [105790] [INFO] Booting worker with pid: 105790
[2020-09-12 12:19:05 +1000] [105790] [INFO] Started server process [105790]
[2020-09-12 12:19:05 +1000] [105790] [INFO] Waiting for application startup.
[2020-09-12 12:19:05 +1000] [105790] [INFO] Application startup complete.
^C[2020-09-12 12:19:06 +1000] [105788] [INFO] Handling signal: int
[2020-09-12 12:19:06 +1000] [105790] [INFO] Shutting down
[2020-09-12 12:19:06 +1000] [105790] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-09-12 12:19:06 +1000] [105790] [INFO] Waiting for application shutdown.
[2020-09-12 12:19:06 +1000] [105790] [INFO] Application shutdown complete.
[2020-09-12 12:19:06 +1000] [105790] [INFO] Finished server process [105790]
[2020-09-12 12:19:06 +1000] [105790] [INFO] Worker exiting (pid: 105790)
[2020-09-12 12:19:07 +1000] [105788] [INFO] Shutting down: Master

Dan inilah output pip freeze :

click==7.1.2
fastapi==0.61.1
gunicorn==20.0.4
h11==0.9.0
httptools==0.1.1
pydantic==1.6.1
starlette==0.13.6
uvicorn==0.11.8
uvloop==0.14.0
websockets==8.1

Saya mencoba menginstal uvicorn dan gunicorn dari GitHub (cabang master) untuk memastikan saya mendapatkan perbaikan terbaru tetapi masalahnya tetap ada.

Semoga ini membantu
fotis

  1. Saya dapat mereproduksi kesalahan log ini dengan pengaturan hanya dengan gunicorn dan uvicorn . Pesan kesalahan ini mulai terjadi dengan uvicorn==0.11.4 dan bukan versi sebelumnya 0.11.3 (baik di OSx dan di wadah Linux). Ini konsisten dengan laporan di atas dengan uvicorn, di mana versi yang dilaporkan selalu lebih besar dari 0.11.4 . Bukti di akhir
  2. Komit bertanggung jawab untuk kesalahan ini adalah ini satu . Masalahnya terletak pada beberapa baris komit yang baru saja disebutkan. Komit hanya mengubah urutan dua blok kode. Jika saya mengembalikan perubahan urutan itu, kesalahan log hilang, sementara masih melewati rangkaian pengujian uvicorn
  3. kesalahan log yang sama terjadi jika salah satu: menggunakan starlette dan fastapi di atas tumpukan gunicorn+uvicorn seperti yang dilaporkan di atas; - menjalankan versi uvicorn terbaru 12.X alih-alih 0.11.4 ; - menjalankan gunicorn dengan lebih dari satu uvicorn pekerja

Bukti . Di folder baru di osx, jalankan skrip terlampir test.sh (diuji di osx). Untuk pengujian di wadah Linux, simpan skrip dan Dockerfile, lalu baca header Dockerfile. Saya juga melampirkan log skrip.

@benoitc , apa pendapat Anda tentang komit ini di uvicorn yang tampaknya memperkenalkan bug? Masalahnya tampaknya ada di antarmuka antara gunicorn dan uvicorn . Bisakah Anda mengomentari urutan 2 blok kode yang diubah dalam komit yang disebutkan di atas dalam uvicorn ? Ini dapat membantu mencari tahu mengapa ini terjadi dengan kasus lain juga. Sejauh ini telah dilaporkan juga dengan aiohttp , gevent , Flask-SocketIO sanic . Saya lampirkan juga log scriptnya untuk memudahkan.

log_test.log

file _test.sh_

#!/bin/bash
python3 -m venv venv
source venv/bin/activate
pip install gunicorn==20.0.04 uvicorn==0.11.4
# create simple uvicorn app
printf "async def app(scope, receive, send):\n    await send()\n" > example.py
# spin up gunicorn with 1 uvicorn worker, and then send TERM signal to gunicorn
gunicorn example:app -w 1 -k uvicorn.workers.UvicornWorker &
sleep 5 && pkill -f gunicorn
sleep 1
# you will see 1 log entry like this one:
# [XX] [YY] [INFO] Error while closing socket [Errno 9] Bad file descriptor

printf "\n\n[INFO] if you instead bump down uvicorn's version from 11.4 to 11.3 [Errno 9] goes away:\n\n"
pip install uvicorn==0.11.3
gunicorn example:app -w 1 -k uvicorn.workers.UvicornWorker &
sleep 5 && pkill -f gunicorn

file _Dockerfile_

# run with:
# docker run -it $(docker build -q .)
FROM python:3.8
COPY test.sh .
RUN chmod +x /test.sh
CMD /test.sh

Saya memiliki masalah yang sama persis. Ini kasus saya.

Singkat : Saya mencoba membuat aplikasi uji untuk Django dwebsocket dengan gunicorn. Ketika saya mencoba menggunakan websocket_client untuk menguji hasilnya, setelah menutup websocket kesalahan ini terjadi setiap saat.

Lingkungan :
Gambar buruh pelabuhan : python:3.7
versi python: python3.7.6
gunicorn : versi = 20.0.4, pekerjaan = gevent
Versi Django : Django==2.2
versi dwebsocket : 0.5.12

Kode:

lihat.py

from dwebsocket import accept_websocket

<strong i="16">@accept_websocket</strong>
def my_ws(request):
    if request.is_websocket():
        ws = request.websocket
        while True:
            msg = ws.wait(timeout=15)
            if msg is None:
                print('get None message')
                break
            else:
                msg = b'echo :' + msg
                ws.send(msg)
                print('send ws seccess')
        print('websocket close')

urls.py

from websocketInfo.views import  my_ws
from django.conf.urls import url

urlpatterns = [
    url(r'my_ws/$', my_ws, name='my_ws')
]

websocket_client

from websocket import create_connection
ws = create_connection("ws://127.0.0.1:8080/my_ws/")
print("Sending 'Hello, World'...")
ws.send("Hello, World")
print("Receiving...")
result = ws.recv()
print(result)
ws.close()
print('ws close')

perintah untuk menjalankan server gunicorn

gunicorn MyWebsocket.wsgi -b 0.0.0.0:8000 -w 3 -k gevent

keluaran kesalahan

send ws seccess
get None message
websocket close
[2021-01-13 02:43:56 +0000] [101] [ERROR] Socket error processing request.
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 65, in handle
    util.reraise(*sys.exc_info())
  File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 625, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 55, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/ggevent.py", line 143, in handle_request
    super().handle_request(listener_name, req, sock, addr)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 128, in handle_request
    util.reraise(*sys.exc_info())
  File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 625, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 114, in handle_request
    resp.write(item)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 326, in write
    self.send_headers()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 322, in send_headers
    util.write(self.sock, util.to_bytestring(header_str, "latin-1"))
  File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 286, in write
    sock.sendall(data)
  File "/usr/local/lib/python3.7/site-packages/gevent/_socket3.py", line 523, in sendall
    return _socketcommon._sendall(self, data_memory, flags)
  File "/usr/local/lib/python3.7/site-packages/gevent/_socketcommon.py", line 367, in _sendall
    chunk_size = max(socket.getsockopt(SOL_SOCKET, SO_SNDBUF), 1024 * 1024)
  File "/usr/local/lib/python3.7/site-packages/gevent/_socket3.py", line 156, in __getattr__
    return getattr(self._sock, name)
  File "/usr/local/lib/python3.7/site-packages/gevent/_socket3.py", line 66, in _dummy
    raise OSError(EBADF, 'Bad file descriptor')
OSError: [Errno 9] Bad file descriptor

@ChrisXiaoShu Jejak tumpukan yang Anda posting memberi tahu kami bahwa objek soket khusus ini telah ditutup secara eksplisit di tingkat Python (saat itulah gevent menggunakan _dummy untuk menghasilkan pengecualian yang sama dengan yang dilakukan sistem operasi). Ini berarti beberapa bagian dari tumpukan aplikasi Anda menutup soket sebelum mengembalikan respons untuk membiarkan gunicorn menanganinya; pada saat kesalahan terjadi, gunicorn bahkan belum mengirim header respons HTTP.

Jenis masalah yang sama dalam kasus saya, dengan perbedaan bahwa kesalahan ini terjadi tanpa melakukan apa pun. Terkadang setelah 5 menit, terkadang setelah 2 jam...

Apakah halaman ini membantu?
0 / 5 - 0 peringkat