Gunicorn: OSError: [Errno 11] Sumber daya untuk sementara tidak tersedia di versi 19.8.1 (dan 19.8.0) di Heroku

Dibuat pada 29 Mei 2018  ·  14Komentar  ·  Sumber: benoitc/gunicorn

Saya menjalankan server Flask sederhana di Heroku:

web: gunicorn --worker-class eventlet -w 1 app:app --log-file=-

Ini menggunakan Python 2.7.15 untuk kompatibilitas dengan berbagai paket lainnya.

Sepertinya saya telah mengalami duplikat masalah ini sejak lama sejak Heroku pindah ke v. 19.8.1. Beberapa gambar (berukuran mulai dari beberapa kb hingga beberapa mb) tidak dapat dimuat; Saya memiliki situs dengan banyak gambar (kebanyakan lembar sprite untuk animasi) dan tampaknya pilihan acak dari mereka tidak akan memuat setiap kali, masing-masing melemparkan kesalahan berikut (jika gambar di-cache dari versi sebelumnya, itu dimuat tanpa masalah) :

2018-05-29T09:24:36.216949+00:00 app[web.1]: [2018-05-29 09:24:36 +0000] [10] [ERROR] Socket error processing request. 2018-05-29T09:24:36.216969+00:00 app[web.1]: Traceback (most recent call last): 2018-05-29T09:24:36.216971+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 66, in handle 2018-05-29T09:24:36.216972+00:00 app[web.1]: six.reraise(*sys.exc_info()) 2018-05-29T09:24:36.216974+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 56, in handle 2018-05-29T09:24:36.216976+00:00 app[web.1]: self.handle_request(listener_name, req, client, addr) 2018-05-29T09:24:36.216978+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 129, in handle_request 2018-05-29T09:24:36.216980+00:00 app[web.1]: six.reraise(*sys.exc_info()) 2018-05-29T09:24:36.216981+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 112, in handle_request 2018-05-29T09:24:36.216983+00:00 app[web.1]: resp.write_file(respiter) 2018-05-29T09:24:36.216985+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 403, in write_file 2018-05-29T09:24:36.216987+00:00 app[web.1]: if not self.sendfile(respiter): 2018-05-29T09:24:36.216989+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 393, in sendfile 2018-05-29T09:24:36.216990+00:00 app[web.1]: sent += sendfile(sockno, fileno, offset + sent, count) 2018-05-29T09:24:36.216992+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/_sendfile.py", line 66, in sendfile 2018-05-29T09:24:36.216994+00:00 app[web.1]: raise OSError(e, os.strerror(e)) 2018-05-29T09:24:36.216996+00:00 app[web.1]: OSError: [Errno 11] Resource temporarily unavailable

ini adalah versi lain di requirements.txt:

Flask==0.12.2 gunicorn==19.8.1 pymongo==3.6.1 flask_socketio==2.9.6 flask_cors==3.0.3 eventlet==0.22.1 gevent==1.2.2

Mengubah gunicorn ke 19.7.1 tampaknya menyelesaikan masalah; itu bertahan dengan 19.8.0.
Seperti masalah serupa dari 2012, ini bukan masalah batas waktu permintaan karena kesalahan yang ditimbulkannya cukup cepat. Mengembalikan ke 19.7.1 telah memperbaikinya, jadi untuk saat ini saya akan tetap menggunakannya, tetapi akan lebih baik jika menggunakan versi terbaru. Sepertinya ini bisa menjadi masalah khusus Heroku; Saya hanya memperhatikan sekitar sebulan terakhir, tetapi tidak dapat menemukan informasi tentang kapan mereka mengubah versi.

Komentar yang paling membantu

Saya berjuang dengan masalah yang sama hari ini, sepanjang hari. Dan saya _think_ akhirnya saya perbaiki. Saya menggunakan nginx, Flask, gunicorn w/ eventlet, dan buruh pelabuhan.

Output pip freeze saya (relevan):

eventlet==0.23.0
Flask==1.0.2
greenlet==0.4.14
gunicorn==19.9.0

Perintah gunicorn saya:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

Gejala pertama adalah beban file statis besar melemparkan ERR_CONTENT_LENGTH_MISMATCH di browser. Jelas ini merusak aplikasi, karena lib JS statis besar tidak dimuat.

Gejala kedua adalah nginx mencatat yang berikut ke error.log: upstream prematurely closed connection while reading upstream

Akhirnya, saya menelusurinya kembali ke item log gunicorn:

Socket error processing request. - [in /usr/local/lib/python2.7/dist-packages/gunicorn/glogging.py:277]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 66, in handle
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 56, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 129, in handle_request
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 112, in handle_request
    resp.write_file(respiter)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 403, in write_file
    if not self.sendfile(respiter):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 393, in sendfile
    sent += sendfile(sockno, fileno, offset + sent, count)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
    raise OSError(e, os.strerror(e))
OSError: [Errno 11] Resource temporarily unavailable

Solusi terakhir saya adalah memulai gunicorn dengan flag --no-sendfile , dan masalahnya hilang. Mengapa? Tidak yakin... Aku hanya senang itu berhasil.

Juga layak disebutkan, selama pemecahan masalah saya, saya melakukan yang terbaik untuk membuat nginx.conf saya menyerupai contoh yang ditemukan di sini: http://docs.gunicorn.org/en/stable/deploy.html

Semua 14 komentar

Saya berjuang dengan masalah yang sama hari ini, sepanjang hari. Dan saya _think_ akhirnya saya perbaiki. Saya menggunakan nginx, Flask, gunicorn w/ eventlet, dan buruh pelabuhan.

Output pip freeze saya (relevan):

eventlet==0.23.0
Flask==1.0.2
greenlet==0.4.14
gunicorn==19.9.0

Perintah gunicorn saya:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

Gejala pertama adalah beban file statis besar melemparkan ERR_CONTENT_LENGTH_MISMATCH di browser. Jelas ini merusak aplikasi, karena lib JS statis besar tidak dimuat.

Gejala kedua adalah nginx mencatat yang berikut ke error.log: upstream prematurely closed connection while reading upstream

Akhirnya, saya menelusurinya kembali ke item log gunicorn:

Socket error processing request. - [in /usr/local/lib/python2.7/dist-packages/gunicorn/glogging.py:277]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 66, in handle
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 56, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 129, in handle_request
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 112, in handle_request
    resp.write_file(respiter)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 403, in write_file
    if not self.sendfile(respiter):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 393, in sendfile
    sent += sendfile(sockno, fileno, offset + sent, count)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
    raise OSError(e, os.strerror(e))
OSError: [Errno 11] Resource temporarily unavailable

Solusi terakhir saya adalah memulai gunicorn dengan flag --no-sendfile , dan masalahnya hilang. Mengapa? Tidak yakin... Aku hanya senang itu berhasil.

Juga layak disebutkan, selama pemecahan masalah saya, saya melakukan yang terbaik untuk membuat nginx.conf saya menyerupai contoh yang ditemukan di sini: http://docs.gunicorn.org/en/stable/deploy.html

Saya menemui masalah ini juga, 19.7.0 berfungsi dengan baik

Apakah ini terjadi segera atau setelah respons yang lama dikirim sebagian?

Mungkin melayani penyebab file statis

Ada pembaruan tentang ini? Saya menghadapi masalah yang sama di 19.9.0

Semuanya bekerja dengan baik dan tiba-tiba itu mulai terjadi.

@tilgovi beri tahu saya jika Anda memerlukan info tentang ini. Tiba-tiba masalah ini mulai muncul

Bagi saya masalahnya adalah karena pekerja eventlet. Saya menghapus eventlet dan semuanya baik-baik saja sekarang.

Saya menemui masalah yang sama. Dan saran dari @SaintSimmo bekerja dengan baik untuk saya. Masalah ini segera terjadi ketika mulai mengunduh file besar. Saya menggunakan labu dan eventlet. Dan pekerjaan pengunduhan dilakukan oleh send_from_directory dari Flask.
Gunicorn dimulai dengan perintah berikut:
gunicorn --event kelas pekerja -w 1 -b 0.0.0.0:4000 unggah: aplikasi
yang akan memberikan kesalahan.
jika "--no-sendfile" ditambahkan dalam perintah, tidak ada pesan kesalahan yang dikirim. Jika pekerjaan pengunduhan dapat dilakukan tanpa "sendfile", jadi kapan "sendfile" ini harus digunakan?

gunicorn (versi 19.9.0) masalah yang sama dengan eventlet

Pada 19.9.0, rekomendasi @SaintSimmo tentang pengaturan --no-sendfile juga berfungsi untuk saya.

Yap, masalah yang sama dan setelah menghapus pekerja eventlet itu berfungsi dengan baik.

Ketika saya memulai server dengan perintah ini (gunicorn -w 1 -k eventlet -b 127.0.0.1:5000 wsgi:app) saya menerima pengecualian di bawah dan gambar saya terpotong pada respons klien.
[ERROR] Permintaan pemrosesan kesalahan soket.
...
BlockingIOError: [Errno 11] Sumber daya tidak tersedia untuk sementara

Menghapus definisi kelas pekerja, itu berhasil.
gunicorn -w 1 -b 127.0.0.1:5000 wsgi:app

@jacebrowning dan @SaintSimmo , saya mengonfirmasi bahwa --no-sendfile parameter ekstra ke perintah gunicorn efektif.

Hal ini biasanya karena nproc terlalu sedikit, Anda dapat menambah jumlah nproc untuk pengguna yang menjalankan program tersebut dengan mengedit file ' /etc/security/limits.conf '.

Apakah Anda menderita masalah ini? Jika Anda menggunakan Python 3.4 atau lebih tinggi, perbarui versi Gunicorn Anda.

Saya memiliki masalah yang sama dengan --worker-class. Saya memperbarui gunicorn ke 20.0.4 dan masalahnya terpecahkan.

Mengubah kelas pekerja menjadi gevent berhasil untuk saya. --worker-class gevent

Apakah halaman ini membantu?
0 / 5 - 0 peringkat