Celery: يتم تنفيذ عشرات الآلاف من مهام backend_cleanup كل ليلة منذ الساعة 10:42 مساءً. تتوقف جميع الوظائف غير المتزامنة عن العمل

تم إنشاؤها على ٢١ أكتوبر ٢٠١٧  ·  3تعليقات  ·  مصدر: celery/celery

قائمة تدقيق

  • [x] لقد قمت بتضمين ناتج celery -A proj report في الإصدار.
    (إذا لم تكن قادرًا على القيام بذلك ، فعليك على الأقل تحديد الكرفس
    الإصدار المتأثر).
  • [x] لقد تحققت من وجود المشكلة في فرع الكرفس master .

تم تطوير تطبيقي باستخدام django1.11 و celery4.1 [sqs]. يتم نشره على Amazon AWS من خلال Elastic Beanstalk. AWS SQS هو الوسيط.

خطوات التكاثر

تظهر المشكلة كل ليلة حوالي الساعة 10:42 مساءً ، وتستمر لمدة ساعة تقريبًا. يبدأ تنفيذ عشرات الآلاف من مهام backend_cleanup. وفقًا لقائمة نتائج المهام في المسؤول ، يتم تنفيذ كل مهمة بنجاح. يظل استخدام وحدة المعالجة المركزية في بعض الأحيان عند 100٪. يصعب فتح كل صفحة من صفحات التطبيق. بعد ساعة واحدة من حدوث المشكلة ، عاد استخدام وحدة المعالجة المركزية إلى طبيعته. ومع ذلك ، فإن قوائم الانتظار آسفين. لا يمكن تنفيذ أي مهام تأخير (). لا بد لي من مسح قائمة الانتظار في SQS ، وإعادة تشغيل التطبيق ، وإعادة تحميل الكود بالكامل إلى AWS Elastic Beanstalk. ثم سيتم تنفيذ مهام التأخير () بشكل طبيعي. إذا لم أقم بالمسح أو إعادة البدء أو إعادة التحميل ، فلن يتم تنفيذ أي من المهام غير المتزامنة. حتى مهمة التنظيف الخلفية المضمنة لا يمكن أن تبدأ. لا يحتوي تطبيقي على أي مهام دورية أو مهام crontab باستثناء مهمة celery.backend_cleanup المضمنة. هل يمكن لأي شخص مساعدتي في هذه المشكلة؟

سلوك متوقع

أحتاج إلى تشغيل التطبيق بالكامل بشكل طبيعي بعد انتهاء مهام backend_cleanup.

السلوك الفعلي

موضح في ## خطوات التكاثر

celery-sqs-worker-report.txt

Question

التعليق الأكثر فائدة

يمكنك ببساطة استبدال الجدول الزمني وتجنب استخدام crontab:
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

ال 3 كومينتر

لقد وجدت للتو أن المشكلة ربما تتعلق بالمهمة المضمنة ، celery.backend_cleanup. لقد قمت بتشغيل التطبيق في بيئة التطوير المحلي. عندما كانت الساعة 10:42 مساءً ، بدأت مهام backend_cleanup الهائلة ونُفذت بنجاح. ومع ذلك ، بعد بضع ثوان ، حدث خطأ. ها هو الخطأ.

[2017-10-23 22:51:27,677: CRITICAL/MainProcess] Unrecoverable error: Exception('Request Empty body  HTTP 599  Server aborted the SSL handshake (None)',)
Traceback (most recent call last):
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/worker.py", line 203, in start
    self.blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 370, in start
    return self.obj.start()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 320, in start
    blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 596, in start
    c.loop(*c.loop_args())
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/loops.py", line 88, in asynloop
    next(loop)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/hub.py", line 354, in create_loop
    cb(*cbargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 111, in on_readable
    return self._on_event(fd, _pycurl.CSELECT_IN)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 124, in _on_event
    self._process_pending_requests()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 132, in _process_pending_requests
    self._process(curl, errno, reason)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 178, in _process
    buffer=buffer, effective_url=effective_url, error=error,
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 150, in __call__
    svpending(*ca, **ck)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 100, in _transback
    return callback(ret)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 98, in _transback
    callback.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 96, in _transback
    ret = filter_(*args + (ret,), **kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/aws/connection.py", line 253, in _on_status_ready
    raise self._for_status(response, response.read())
Exception: Request Empty body  HTTP 599  Server aborted the SSL handshake (None)

وفي الوقت نفسه ، اختفت قائمة الانتظار من AWS SQS. ثم استمر تنفيذ عدد قليل من مهام backend_cleanup. وأخيرًا ، ظهر تحذير.

[2017-10-23 22: 51: 28،967: تحذير / العملية الرئيسية] استعادة 10 رسائل غير معترف بها

وأخيرًا ، توقف اتصال HTTPS بقائمة انتظار SQS. تعذر على التطبيق إعادة الاتصال بـ SQS ما لم أعد نشر التطبيق على AWS Elastic Beanstalk.

هل يمكن لأي شخص مساعدتي في هذه المشكلة؟ سيكون موضع تقدير كبير أي رد.

أعتقد أنني حللت المشكلة. لا تحدث المشكلة أبدًا بعد أن قمت بتغيير CELERY_RESULT_BACKEND إلى "redis" من "django-db" ، وتغيير CELERY_TIMEZONE إلى "UTC". على الرغم من أن نتائج المهمة في Django Admin توقفت عن إضافة أي نتائج مهمة ، فقد تم حل مشكلتي بشكل كبير.

يمكنك ببساطة استبدال الجدول الزمني وتجنب استخدام crontab:
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات