Gunicorn कार्यकर्ता टाइमआउट त्रुटि


182

मेरे पास 3 वर्कर 30 वर्कर कनेक्शन और इवेंटलेट वर्कर क्लास का उपयोग करने के लिए सेटअप है। यह Nginx के पीछे सेटअप है। हर कुछ अनुरोधों के बाद, मैं इसे लॉग में देखता हूं।

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

ये क्यों हो रहा है? मैं कैसे पता लगा सकता हूं कि क्या गलत हो रहा है?

धन्यवाद


2
आप समस्या को हल करने में सक्षम थे? कृपया अपने विचार साझा करें क्योंकि मैं भी इसके साथ फंस गया हूं। Gunicorn==19.3.1औरgevent==1.0.1
ब्लैक_डर

2
इसका हल ढूंढ लिया। बहुत बड़े मूल्य तक समय के साथ वृद्धि हुई और फिर मैं स्टैक ट्रेस देखने में सक्षम था
ब्लैक_इडर

जवाबों:


156

हमें Django + nginx + gunicorn का उपयोग करने में एक ही समस्या थी। Gunicorn प्रलेखन से हमने सुशोभित-टाइमआउट को कॉन्फ़िगर किया है जिसने लगभग कोई अंतर नहीं किया है।

कुछ परीक्षण के बाद, हमने समाधान पाया, कॉन्फ़िगर करने के लिए पैरामीटर है: टाइमआउट (और सुंदर टाइमआउट नहीं)। यह घड़ी की तरह काम करता है ।।

ऐसा:

1) gunicorn कॉन्फ़िगरेशन फ़ाइल खोलें

2) क्या आप कभी जरूरत के लिए समय निर्धारित - मूल्य सेकंड में है

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
धन्यवाद यह सही उत्तर है। और फिर, कई समवर्ती कनेक्शनों के साथ संसाधनों को बचाने के लिए: pip install geventफिर worker_class geventआपकी कॉन्फ़िगरेशन फ़ाइल में या -k geventकमांड लाइन पर।
Little_birdie

2
सुपरवाइज़र के साथ दौड़ने वाले ने इसे conf.d / app.conf में जोड़ा :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
lukik


21

के साथ Gunicorn चलाएं --log-level=DEBUG

यह आपको एक ऐप स्टैक ट्रेस देना चाहिए।


41
यह मेरे मामले में नहीं है।
जो

16
अब यह है--log-level debug
मनोचिकित्सा

4
मैं एक स्ट्रेक्ट्रेस प्राप्त करना पसंद करूंगा, लेकिन उनमें से कोई भी यहां काम नहीं करता है, 19.4.5 का उपयोग कर। डिबग सामान प्रदर्शित किया जाता है, इसलिए मुझे लगता है कि ध्वज को मान्यता दी गई थी, लेकिन समय पर स्टैकट्रेस नहीं।
orzel


6

आपको एक अन्य कार्यकर्ता प्रकार की कक्षा का उपयोग करने की आवश्यकता है जैसे कि एक एस्क्वायंट , जैसे कि जियोवेंट या बवंडर इसे और अधिक स्पष्टीकरण के लिए देखते हैं: पहला अन्वेषण:

आप ईवेंटलेट या गीवेंट को स्थापित करना चाह सकते हैं यदि आप अपेक्षा करते हैं कि आपके आवेदन कोड को प्रसंस्करण प्रक्रिया के दौरान विस्तारित अवधि के लिए रोकना पड़ सकता है

दूसरा :

डिफ़ॉल्ट सिंक्रोनस वर्कर यह मान लेते हैं कि आपका एप्लिकेशन CPU और नेटवर्क बैंडविड्थ के संदर्भ में बाध्य है। आम तौर पर इसका मतलब यह है कि आपके आवेदन को कुछ भी नहीं करना चाहिए जो अपरिभाषित राशि लेता है। उदाहरण के लिए, इंटरनेट का एक अनुरोध इस मापदंड को पूरा करता है। कुछ बिंदु पर बाहरी नेटवर्क इस तरह से विफल हो जाएगा कि ग्राहक आपके सर्वर पर ढेर हो जाएंगे।


मैं वास्तव में इस तरह के एक अलग कार्यकर्ता वर्ग का उपयोग कैसे करूंगा?
फ्रेडरिक नॉर्ड

6

मेरे पास बहुत ही समस्या थी, मैंने "रनसर्वर" का उपयोग करके यह देखने की भी कोशिश की कि क्या मुझे कुछ मिल सकता है लेकिन मेरे पास एक संदेश था Killed

इसलिए मैंने सोचा कि यह संसाधन की समस्या हो सकती है, और मैं उदाहरण के लिए अधिक रैम देने के लिए आगे बढ़ा, और यह काम किया।


1
मैं इस समस्या को जियोवेंट और टाइमआउट के साथ भी सही ढंग से देख रहा था, स्मृति से बाहर समस्या थी
bcattle

6

WORKER TIMEOUTइसका अर्थ है कि आपका आवेदन निर्धारित समय में अनुरोध का जवाब नहीं दे सकता है। आप इसे gunicorn टाइमआउट सेटिंग्स का उपयोग करके सेट कर सकते हैं । कुछ एप्लिकेशन को दूसरे की तुलना में प्रतिक्रिया के लिए अधिक समय चाहिए।

एक और चीज जो इसे प्रभावित कर सकती है वह है श्रमिक प्रकार चुनना

डिफ़ॉल्ट सिंक्रोनस श्रमिक यह मानते हैं कि आपका एप्लिकेशन CPU और नेटवर्क बैंडविड्थ के संदर्भ में संसाधन-बाध्य है। आम तौर पर इसका मतलब है कि आपके एप्लिकेशन को ऐसा कुछ भी नहीं करना चाहिए जो अपरिभाषित राशि लेता है। कुछ का एक उदाहरण जो अपरिभाषित राशि लेता है वह इंटरनेट का अनुरोध है। कुछ बिंदु पर बाहरी नेटवर्क इस तरह से विफल हो जाएगा कि ग्राहक आपके सर्वर पर ढेर हो जाएंगे। तो, इस अर्थ में, कोई भी वेब एप्लिकेशन जो एपीआई के लिए आउटगोइंग अनुरोध करता है, एक अतुल्यकालिक कार्यकर्ता से लाभान्वित होगा।

जब मुझे आपकी जैसी समस्या हुई (मैं डॉकर स्वार्म का उपयोग करके अपने आवेदन को तैनात करने की कोशिश कर रहा था), मैंने टाइमआउट को बढ़ाने और एक अन्य प्रकार के कार्यकर्ता वर्ग का उपयोग करने की कोशिश की है। लेकिन सभी असफल रहे।

और फिर मुझे अचानक एहसास हुआ कि मैं अपनी रचना फ़ाइल के अंदर सेवा के लिए अपने संसाधन को बहुत कम कर रहा हूं। यह मेरे मामले में आवेदन को धीमा कर दिया है

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

इसलिए मैं आपको यह जांचने के लिए सुझाव देता हूं कि पहली जगह में आपके आवेदन को धीमा करने वाली कौन सी चीज है


4

क्या यह समापन बिंदु बहुत अधिक समय ले रहा है?

हो सकता है कि आप असेंबल सपोर्ट के बिना फ्लास्क का इस्तेमाल कर रहे हों, इसलिए हर रिक्वेस्ट कॉल को ब्लॉक कर देगी। बिना मुश्किल के async समर्थन बनाने के लिए, geventकार्यकर्ता को जोड़ें ।

जियोवेंट के साथ, एक नया कॉल एक नया धागा स्पॉन करेगा, और आप एप्लिकेशन को अधिक अनुरोध प्राप्त करने में सक्षम होंगे

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

1
सरल tweak .. मेरा दिन बचाया!
पेंडुडेव

3

मुझे डॉकटर में भी यही समस्या है।

डॉकर में मैं प्रशिक्षित LightGBMमॉडल + Flaskसेवारत अनुरोध रखता हूं । HTTP सर्वर के रूप में मैंने इस्तेमाल किया gunicorn 19.9.0। जब मैं अपने कोड को स्थानीय रूप से अपने मैक लैपटॉप पर चलाता हूं तो सब कुछ एकदम सही काम करता है, लेकिन जब मैंने डॉकर में ऐप चलाया तो मेरे POST JSON के अनुरोध कुछ समय के लिए फ्रीज हो गए थे, तब gunicornकार्यकर्ता [CRITICAL] WORKER TIMEOUTअपवाद के साथ विफल हो गया था ।

मैंने विभिन्न दृष्टिकोणों के टन की कोशिश की, लेकिन केवल एक ही मेरी समस्या को हल कर रहा था worker_class=gthread

यहाँ मेरा पूरा विन्यास है:

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

आपके कुछ अन्य उत्तरों को भी उकेरा गया है, क्योंकि यह पर्याप्त नहीं है: P
अचला डिसनायके


1

टाइमआउट इस समस्या का एक प्रमुख पैरामीटर है।

हालाँकि यह मेरे लिए शोभा नहीं देता।

मैंने पाया कि जब मैं श्रमिक = 1 को सेट करता है, तो कोई भी समय पर त्रुटि नहीं होती है।

जब मैं अपने कोड को देखता हूं, तो मुझे सर्वर इनिट में कुछ सॉकेट कनेक्ट (socket.send & socket.recv) मिला।

socket.recv मेरा कोड ब्लॉक कर देगा और इसीलिए यह हमेशा समयबाह्य होता है जब श्रमिकों> 1

उन लोगों को कुछ विचार देने की आशा करता हूं, जिन्हें मुझसे कुछ समस्या है


1

यह मेरे लिए काम किया:

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

यदि आपके पास है eventlet:

--worker-class=eventlet

यदि आपके पास है gevent:

--worker-class=gevent

0

मेरे लिए, समाधान --timeout 90मेरे एंट्रीपॉइंट में जोड़ने का था , लेकिन यह काम नहीं कर रहा था क्योंकि मेरे पास दो एंट्रोप्वाइंट्स परिभाषित थे, एक app.yaml में, और दूसरा मेरे डॉकरफाइल में। मैंने अप्रयुक्त प्रविष्टि को हटा दिया और --timeout 90दूसरे में जोड़ दिया ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.