Gunicorn çalışan zaman aşımı hatası


182

3 işçi 30 işçi bağlantısı ve etkinlik işçi sınıfı kullanarak gunicorn ayarladım. Nginx'in arkasına kurulur. Her birkaç istekten sonra bunu günlüklerde görüyorum.

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

Bu neden oluyor? Neyin yanlış gittiğini nasıl anlayabilirim?

Teşekkürler


2
Sorunu çözebildin mi? Ben de onunla sıkışmış gibi düşüncelerinizi paylaşın lütfen. Gunicorn==19.3.1vegevent==1.0.1
Black_Rider

2
Bunun için bir çözüm buldu. Çok büyük bir değere artan zaman aşımı ve sonra yığın izini
görebildim

Yanıtlar:


156

Aynı sorunu Django + nginx + gunicorn kullanırken de yaşadık. Gunicorn belgelerinden, neredeyse hiç fark yaratmayan zarif zaman aşımını yapılandırdık.

Bazı testlerden sonra çözümü bulduk, yapılandırılacak parametre: zaman aşımı (Ve zarif zaman aşımı değil). Saat gibi çalışıyor ..

Yani, Yap:

1) gunicorn yapılandırma dosyasını açın

2) TIMEOUT'u ihtiyacınız olana ayarlayın - değer saniyeler içinde

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
Teşekkürler bu doğru cevap. Ve sonra, birçok eşzamanlı bağlantıyla kaynakları kaydetmek için:, pip install geventsonra worker_class geventyapılandırma dosyanızda veya -k geventkomut satırında.
little_birdie

2
Danışman ile koşuyorum, bu yüzden 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
conf.d

31

Google Bulut Just On eklemek --timeout 90giriş noktasını içinapp.yaml

entrypoint: gunicorn -b :$PORT main:app --timeout 90

21

Gunicorn ile çalıştırın --log-level=DEBUG.

Size bir uygulama yığını izleme vermelidir.


41
Benim durumumda değil.
Joe

16
şimdi--log-level debug
psychok7

4
Bir stracktrace almak isterdim, ama hiçbiri burada gunicorn 19.4.5 kullanarak çalışmıyor. Hata ayıklama şeyler görüntülenir, bu yüzden bayrak tanındı, ancak zaman aşımı üzerinde stacktrace değil sanırım.
orzel


6

Sen gibi kullanılan bir diğer işçi tipi sınıfına bir zaman uyumsuz bir ihtiyaç gevent veya kasırga fazla açıklama için bu bkz: Birinci explantion:

Uygulama kodunuzun istek işleme sırasında uzun süre duraklaması gerekebileceğini düşünüyorsanız Eventlet veya Gevent'i de yüklemek isteyebilirsiniz.

İkinci :

Varsayılan eşzamanlı çalışanlar, uygulamanızın CPU ve ağ bant genişliği açısından kaynağa bağlı olduğunu varsayar. Genellikle bu, uygulamanızın tanımlanmamış bir zaman alan hiçbir şey yapmaması gerektiği anlamına gelir. Örneğin, internete yapılan bir talep bu kriterleri karşılamaktadır. Bir noktada harici ağ, istemcilerin sunucularınızda birikeceği şekilde başarısız olur.


Aslında böyle farklı bir işçi sınıfından nasıl yararlanabilirim?
Frederick Nord

6

Ben çok benzer bir sorun vardı, ben de bir şey bulabiliriz görmek için "runserver" kullanarak denedim ama sahip olduğum tek şey bir mesaj oldu Killed

Bu yüzden kaynak sorunu olabileceğini düşündüm ve örneğe daha fazla RAM vermeye devam ettim ve işe yaradı.


1
Hatta gevent ve zaman aşımı doğru ayarlanmış ile bu sorunu görüyordum, bellek
yetersiz

6

WORKER TIMEOUT, uygulamanızın isteğe belirli bir sürede yanıt veremeyeceği anlamına gelir. Gunicorn zaman aşımı ayarlarını kullanarak bunu ayarlayabilirsiniz . Bazı uygulamaların yanıt vermesi diğerine göre daha fazla zamana ihtiyaç duyar.

Bunu etkileyebilecek başka bir şey , işçi türünü seçmektir

Varsayılan eşzamanlı çalışanlar, uygulamanızın CPU ve ağ bant genişliği açısından kaynağa bağlı olduğunu varsayar. Genellikle bu, uygulamanızın tanımlanmamış bir zaman alan hiçbir şey yapmaması gerektiği anlamına gelir. Tanımlanamayan bir zaman alan bir şeye örnek internet talebidir. Bir noktada harici ağ, istemcilerin sunucularınızda birikeceği şekilde başarısız olur. Dolayısıyla, bu anlamda, API'lara giden istekte bulunan herhangi bir web uygulaması, eşzamansız bir çalışandan faydalanacaktır.

Seninle aynı problemi aldığımda (Docker Swarm kullanarak uygulamamı dağıtmaya çalışıyordum), zaman aşımını artırmaya ve başka bir işçi sınıfı türü kullanmaya çalıştım. Ama hepsi başarısız oldu.

Ve sonra aniden kaynağımı çok düşük şekilde sınırlandırdığımı fark ettim hizmet için . Benim durumumda uygulamayı yavaşlatan şey bu

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

Bu yüzden öncelikle başvurunuzu yavaşlatan şeyleri kontrol etmenizi öneririm


4

Bu son nokta çok fazla zaman alıyor mu?

Belki de eşzamansız destek olmadan şişeyi kullanıyorsunuz, bu nedenle her istek çağrıyı engelleyecektir. Zorlaştırmadan zaman uyumsuz destek oluşturmak içingevent çalışanı .

Gevent ile yeni bir çağrı yeni bir ileti dizisi oluşturacak ve uygulamanız daha fazla istek alabilecek

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

1
basit tweak .. günümü kurtardı!
penduDev

3

Docker'da da aynı problem var.

Docker'da eğitimli LightGBMmodel + Flasksunum istekleri saklıyorum. HTTP sunucusu olarak kullandım gunicorn 19.9.0. Kodumu Mac dizüstü bilgisayarımda yerel olarak çalıştırdığımda her şey mükemmel çalıştı, ancak uygulamayı Docker'da çalıştırdığımda POST JSON istekleri bir süredir donuyordu, gunicornişçi [CRITICAL] WORKER TIMEOUTistisna dışında başarısız olmuştu .

Tonlarca farklı yaklaşım denedim, ancak sorunumu çözen tek şey ekledi worker_class=gthread.

İşte benim tam yapılandırma:

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

Diğer cevaplarınızın bazılarını da oyladı sadece bu yeterli değil: P
Achala Dissanayake


1

zaman aşımı bu sorunun anahtar parametresidir.

ancak benim için uygun değil.

i işçi = 1 ayarlarken gunicorn zaman aşımı hatası olmadığını buldum.

benim kod olsa baktığınızda , sunucu init bazı soket connect (socket.send & socket.recv) bulundu.

socket.recv kodumu bloke edecek ve bu yüzden işçiler> 1 olduğunda her zaman zaman aşımı

benimle sorunu olan insanlara bazı fikirler vermeyi umuyorum


1

Bu benim için çalıştı:

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

Eğer varsa eventleteklenti:

--worker-class=eventlet

Eğer varsa geventeklenti:

--worker-class=gevent

0

Benim için çözüm, --timeout 90giriş noktama eklemekti, ancak işe yaramadı çünkü biri app.yaml'de diğeri Dockerfile'da iki tane giriş noktası tanımladım. Kullanılmayan giriş noktasını sildim --timeout 90ve diğerine ekledim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.