Saya memiliki setup gunicorn dengan 3 pekerja 30 koneksi pekerja dan menggunakan kelas pekerja eventlet. Ini adalah pengaturan di belakang Nginx. Setelah setiap beberapa permintaan, saya melihat ini di log.
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
Mengapa ini terjadi? Bagaimana saya bisa mengetahui apa yang salah?
Terima kasih
Gunicorn==19.3.1
dangevent==1.0.1
Jawaban:
Kami memiliki masalah yang sama menggunakan Django + nginx + gunicorn. Dari dokumentasi Gunicorn kami telah mengkonfigurasi timeout anggun yang membuat hampir tidak ada perbedaan.
Setelah beberapa pengujian, kami menemukan solusinya, parameter untuk mengkonfigurasi adalah: batas waktu (Dan batas waktu tidak anggun). Ini bekerja seperti jam ..
Begitu juga:
1) buka file konfigurasi gunicorn
2) atur TIMEOUT ke apa yang Anda butuhkan - nilainya dalam hitungan detik
sumber
pip install gevent
laluworker_class gevent
di file konfigurasi Anda atau-k gevent
pada baris perintah.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
Di Google Cloud Cukup tambahkan
--timeout 90
ke titik masuk diapp.yaml
sumber
Jalankan Gunicorn dengan
--log-level=DEBUG
.Seharusnya memberi Anda jejak tumpukan aplikasi.
sumber
--log-level debug
Mungkinkah ini? http://docs.gunicorn.org/en/latest/settings.html#timeout
Kemungkinan lain bisa jadi respons Anda terlalu lama atau macet menunggu.
sumber
Anda perlu menggunakan kelas tipe pekerja lain yang async seperti gevent atau tornado lihat ini untuk penjelasan lebih lanjut: Penjelasan pertama:
Kedua :
sumber
Saya memiliki masalah yang sangat mirip, saya juga mencoba menggunakan "runserver" untuk melihat apakah saya dapat menemukan sesuatu tetapi yang saya miliki hanyalah sebuah pesan
Killed
Jadi saya pikir itu bisa menjadi masalah sumber daya, dan saya terus memberi RAM lebih banyak untuk instance, dan itu berhasil.
sumber
WORKER TIMEOUT
berarti aplikasi Anda tidak dapat menanggapi permintaan dalam jumlah waktu yang ditentukan. Anda dapat mengatur ini menggunakan pengaturan batas waktu gunicorn . Beberapa aplikasi memerlukan lebih banyak waktu untuk merespons daripada yang lain.Hal lain yang mungkin mempengaruhi hal ini adalah memilih jenis pekerja
Ketika saya mendapat masalah yang sama dengan Anda (saya mencoba untuk menyebarkan aplikasi saya menggunakan Docker Swarm), saya telah mencoba untuk meningkatkan batas waktu dan menggunakan jenis kelas pekerja lainnya. Namun semuanya gagal.
Dan kemudian saya tiba-tiba menyadari bahwa saya membatasi sumber daya saya terlalu rendah untuk layanan di dalam file penulisan saya. Ini adalah hal memperlambat aplikasi dalam kasus saya
Jadi saya sarankan Anda untuk memeriksa hal apa yang memperlambat aplikasi Anda
sumber
Apakah titik akhir ini terlalu lama?
Mungkin Anda menggunakan labu tanpa dukungan sinkronisasi, sehingga setiap permintaan akan memblokir panggilan. Untuk membuat dukungan async tanpa menyulitkan, tambahkan
gevent
pekerja.Dengan gevent, panggilan baru akan menelurkan utas baru, dan aplikasi Anda akan dapat menerima lebih banyak permintaan
sumber
Saya punya masalah yang sama di Docker.
Di Docker saya menyimpan permintaan
LightGBM
model +Flask
melayani yang terlatih . Sebagai server HTTP yang saya gunakangunicorn 19.9.0
. Ketika saya menjalankan kode saya secara lokal pada laptop Mac saya semuanya bekerja dengan sempurna, tetapi ketika saya menjalankan aplikasi di Docker, permintaan POST JSON saya membeku selama beberapa waktu, makagunicorn
pekerja telah gagal[CRITICAL] WORKER TIMEOUT
kecuali.Saya mencoba banyak pendekatan berbeda, tetapi satu-satunya yang memecahkan masalah saya adalah menambahkan
worker_class=gthread
.Ini konfigurasi lengkap saya:
sumber
Jika Anda menggunakan GCP maka Anda harus mengatur pekerja per jenis instance.
Tautan ke praktik terbaik GCP https://cloud.google.com/appengine/docs/standard/python3/runtime
sumber
batas waktu adalah parameter kunci untuk masalah ini.
tapi itu tidak cocok untukku.
saya menemukan tidak ada kesalahan waktu habis gunicorn ketika saya mengatur pekerja = 1.
ketika saya melihat-lihat kode saya, saya menemukan beberapa soket terhubung (socket.send & socket.recv) di server init.
socket.recv akan memblokir kode saya dan itulah mengapa selalu habis ketika pekerja> 1
berharap dapat memberikan beberapa ide kepada orang-orang yang memiliki masalah dengan saya
sumber
Ini bekerja untuk saya:
Jika Anda telah
eventlet
menambahkan:Jika Anda telah
gevent
menambahkan:sumber
Bagi saya, solusinya adalah menambahkan
--timeout 90
ke titik masuk saya, tetapi tidak berfungsi karena saya telah menentukan dua titik masuk, satu di app.yaml, dan satu lagi di Dockerfile saya. Saya menghapus titik masuk yang tidak digunakan dan menambahkan--timeout 90
yang lain.sumber