গ্যানিকর্ন কর্মীর সময়সীমা ত্রুটি


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
এর সমাধান খুঁজে পেয়েছি। খুব বড় মান পর্যন্ত সময়সীমা বাড়ানো এবং তারপরে আমি স্ট্যাক ট্রেস দেখতে
পেলাম

উত্তর:


154

জ্যাঙ্গো + এনগিনেক্স + গানিকোর্ন ব্যবহার করে আমাদের একই সমস্যা হয়েছিল। গ্যানিকর্ন ডকুমেন্টেশন থেকে আমরা গ্রেফিস-টাইমআউটটি কনফিগার করেছি যা প্রায় কোনও পার্থক্য করে না।

কিছু পরীক্ষার পরে, আমরা সমাধানটি খুঁজে পেলাম, কনফিগার করার জন্য প্যারামিটারটি হ'ল: সময়সীমা (এবং ক্রেফিয়াল টাইমআউট নয়)। এটি একটি ঘড়ির মতো কাজ করে ..

তাই:

1) গ্যানিকর্ন কনফিগারেশন ফাইলটি খুলুন

2) আপনার যা যা প্রয়োজন প্রয়োজন তার জন্য TIMEOUT সেট করুন - মানটি সেকেন্ডে

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কমান্ড লাইন।
ছোট_বীরদী

2
সুপারভাইজারের সাথে দৌড়াচ্ছি তাই এটি কনফিডারে / 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
লুকিক


21

গুনিকর্ন দিয়ে চালান --log-level=DEBUG

এটি আপনাকে একটি অ্যাপ স্ট্যাক ট্রেস দেয়।


41
এটা আমার ক্ষেত্রে হয় না।
জো

16
এটি এখন--log-level debug
সাইকোক 7

4
আমি একটি স্ট্র্যাকট্রেস পেতে চাই, তবে তাদের কেউই এখানে কাজ করে না, 19.4.5 ব্যবহার করে। ডিবাগ স্টাফ প্রদর্শিত হয়, তাই আমি অনুমান করি যে পতাকাটি স্বীকৃত ছিল, কিন্তু সময়সীমাতে স্ট্যাকট্রেস নয়।
orzel

10

এটা কি হতে পারে? http://docs.gunicorn.org/en/latest/settings.html#timeout

অন্যান্য সম্ভাবনাগুলি হতে পারে আপনার প্রতিক্রিয়াটি খুব বেশি সময় নিচ্ছে বা অপেক্ষা করে আটকে আছে।


6

জেনেন্ট বা টর্নেডোর মতো অ্যাসিঙ্কের মতো আরও একটি কর্মী টাইপ শ্রেণি ব্যবহার করা দরকার এটি আরও ব্যাখ্যার জন্য: প্রথম ব্যাখ্যা:

আপনি যদি অনুরোধ প্রক্রিয়াকরণের সময় আপনার অ্যাপ্লিকেশন কোডটির বর্ধিত সময়ের জন্য বিরতি দেওয়ার প্রয়োজন আশা করেন তবে আপনি ইভেন্টলেট বা জেন্টও ইনস্টল করতে চাইতে পারেন

দ্বিতীয়টি:

ডিফল্ট সিঙ্ক্রোনাস কর্মীরা ধরে নিচ্ছেন যে আপনার অ্যাপ্লিকেশনটি সিপিইউ এবং নেটওয়ার্ক ব্যান্ডউইদথের ক্ষেত্রে সীমাবদ্ধ resource সাধারণত এর অর্থ হ'ল আপনার আবেদনের এমন কিছু করা উচিত নয় যা সময় নির্ধারিত সময় নেয়। উদাহরণস্বরূপ, ইন্টারনেটে একটি অনুরোধ এই মানদণ্ডটি পূরণ করে। এক পর্যায়ে বাহ্যিক নেটওয়ার্ক এমনভাবে ব্যর্থ হবে যে ক্লায়েন্টগুলি আপনার সার্ভারগুলিতে পাইল আপ হয়ে যাবে।


আমি কীভাবে আসলে এইরকম একটি পৃথক শ্রমিক শ্রেণি ব্যবহার করব?
ফ্রেডেরিক নর্ড

6

আমার খুব অনুরূপ সমস্যা ছিল, আমি "রানসভার" ব্যবহার করার চেষ্টা করেছিলাম যে আমি কিছু খুঁজে পাচ্ছি কিনা তা দেখার জন্য তবে আমার যা ছিল তা সবই একটি বার্তা ছিল Killed

সুতরাং আমি ভেবেছিলাম এটি রিসোর্স সমস্যা হতে পারে, এবং আমি উদাহরণটি আরও র‌্যাম দেওয়ার জন্য এগিয়ে গিয়েছিলাম এবং এটি কার্যকর হয়েছিল।


1
আমি উদ্দীপনা এবং সময়সীমাটি সঠিকভাবে সেট
করেও

6

WORKER TIMEOUTএর অর্থ আপনার অ্যাপ্লিকেশন কোনও সময় নির্ধারিত পরিমাণে অনুরোধের জবাব দিতে পারে না। আপনি এটি গিনিকর্ন টাইমআউট সেটিংস ব্যবহার করে সেট করতে পারেন । কিছু অ্যাপ্লিকেশন অন্যটির চেয়ে প্রতিক্রিয়া বেশি সময় প্রয়োজন।

এটির প্রভাব ফেলতে পারে এমন আরেকটি জিনিস হ'ল শ্রমিকের ধরণ

ডিফল্ট সিঙ্ক্রোনাস কর্মীরা ধরে নিচ্ছেন যে আপনার অ্যাপ্লিকেশনটি সিপিইউ এবং নেটওয়ার্ক ব্যান্ডউইথের শর্তে রিসোর্স-আবদ্ধ। সাধারণত এর অর্থ হ'ল আপনার আবেদনের এমন কিছু করা উচিত নয় যা সময় নির্ধারিত সময় নেয়। একটি অপরিবর্তিত পরিমাণ সময় নেয় এমন কোনও কিছুর উদাহরণ ইন্টারনেটের কাছে একটি অনুরোধ। এক পর্যায়ে বাহ্যিক নেটওয়ার্ক এমনভাবে ব্যর্থ হবে যে ক্লায়েন্টগুলি আপনার সার্ভারগুলিতে পাইল আপ হয়ে যাবে। সুতরাং, এই অর্থে, যে কোনও ওয়েব অ্যাপ্লিকেশন যা এপিআইগুলিতে বহির্গামী অনুরোধ করে তা অ্যাসিক্রোনাস কর্মী দ্বারা উপকৃত হবে।

আমি যখন আপনার মতো একই সমস্যাটি পেয়েছি (আমি ডকার সোর্ম ব্যবহার করে আমার অ্যাপ্লিকেশন মোতায়েন করার চেষ্টা করছিলাম) তখন আমি সময়সীমা বাড়াতে এবং অন্য ধরণের শ্রমিক শ্রেণি ব্যবহার করার চেষ্টা করেছি। কিন্তু সব ব্যর্থ।

এবং তারপরে আমি হঠাৎ বুঝতে পারি যে আমার রচনা ফাইলের ভিতরে পরিষেবাটির জন্য আমি আমার সংস্থানটি খুব কম সীমাবদ্ধ করছি was এই বিষয়টি আমার ক্ষেত্রে অ্যাপ্লিকেশনটি ধীর করে দেয়

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

সুতরাং আমি আপনাকে প্রথমে আপনার অ্যাপ্লিকেশনটি ধীর করে দেওয়ার জন্য কোন জিনিস পরীক্ষা করার পরামর্শ দিচ্ছি


4

এই শেষ পয়েন্টটি কি অনেক বেশি সময় নিচ্ছে?

সম্ভবত আপনি অ্যাসিঙ্ক্রোনাস সমর্থন ছাড়াই ফ্লাস্ক ব্যবহার করছেন, তাই প্রতিটি অনুরোধ কলটি ব্লক করে দেবে। অসুবিধা না করে অ্যাসিঙ্ক সমর্থন তৈরি করতে geventকর্মী যুক্ত করুন।

উদ্দীপনা সহ, একটি নতুন কল একটি নতুন থ্রেড উত্সাহিত করবে, এবং আপনি অ্যাপ্লিকেশন আরও অনুরোধ পেতে সক্ষম হবেন

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

1
সরল ত্বক .. আমার দিন বাঁচাল!
পেনডুদেভ

2

আমি ডকারেও একই সমস্যা পেয়েছি।

ডকারে আমি প্রশিক্ষিত LightGBMমডেল + Flaskপরিবেশন অনুরোধ রাখি । এইচটিটিপি সার্ভার হিসাবে আমি ব্যবহার করেছি gunicorn 19.9.0। আমি যখন আমার ম্যাক ল্যাপটপে স্থানীয়ভাবে আমার কোডটি চালিত করি তখন সবকিছুই নিখুঁতভাবে কাজ করে, তবে আমি যখন ডকারে অ্যাপটি চালাতাম তখন আমার পোস্ট জেএসওন অনুরোধগুলি কিছু সময়ের জন্য হিমশীতল হয়ে পড়েছিল, তখন 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

আপনার অন্যান্য উত্তরগুলি উত্সাহিত করেছেন পাশাপাশি
এটিও


1

সময়সীমা এই সমস্যার মূল প্যারামিটার।

তবে এটি আমার পক্ষে উপযুক্ত নয়।

আমি খুঁজে পেয়েছি যে আমি কর্মীরা = 1 সেট করলে বন্দুকের সময়সীমা ত্রুটি নেই।

যখন আমি আমার কোড হিসাবে দেখছি , তখন আমি সার্ভার ইমে কিছু সকেট সংযোগ (সকেট.সেন্ড ও সকেট.রেসিভ) পেয়েছি।

सॉকেট.রেসিভি আমার কোডটি ব্লক করবে এবং সে কারণেই শ্রমিকরা> 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আমার এন্টিপয়েন্টে যুক্ত করা ছিল , তবে এটি কাজ করছে না কারণ আমার টিডব্লিউও এন্ট্রিপয়েন্টগুলি সংজ্ঞায়িত করা হয়েছিল, একটি অ্যাপ্লিকেশন-আইএমএল এবং অন্যটি আমার ডকফাইফিলে। আমি অব্যবহৃত এন্টিপয়েন্টটি মুছলাম এবং অন্যটিতে যুক্ত করেছি --timeout 90

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.