अजवाइन के कार्य को समझना


79

मुझे बस कॉन्फ़िगरेशन विकल्प CELERYD_PREFETCH_MULTIPLIER( डॉक्स ) के बारे में पता चला । डिफ़ॉल्ट 4 है, लेकिन (मेरा मानना ​​है) मैं प्रीफ़ेटिंग को बंद करना चाहता हूं या जितना संभव हो उतना कम। मैंने इसे अभी 1 पर सेट किया है, जो मैं देख रहा हूँ के लिए पर्याप्त है, लेकिन अभी भी कुछ चीजें हैं जो मुझे समझ में नहीं आती हैं:

  1. यह एक अच्छा विचार क्यों है? मुझे वास्तव में इसका कोई कारण नहीं दिखता है, जब तक कि संदेश कतार और श्रमिकों के बीच बहुत विलंबता न हो (मेरे मामले में, वे वर्तमान में एक ही होस्ट पर चल रहे हैं और अंततः एक ही डेटा में अलग-अलग होस्ट पर चल सकते हैं केंद्र)। प्रलेखन में केवल नुकसान का उल्लेख है, लेकिन यह बताने में विफल है कि फायदे क्या हैं।

  2. बहुत से लोग इसे 0 पर सेट करने की उम्मीद करते हैं, इस तरह से प्रीफेटिंग को बंद करने में सक्षम होने की उम्मीद करते हैं (मेरी राय में एक उचित धारणा)। हालांकि, 0 का मतलब है असीमित प्रीफेचिंग। कोई भी व्यक्ति कभी भी असीमित प्रीफ़ेचिंग क्यों चाहेगा, क्या यह पूरी तरह से उस संगामिति / अतुल्यकालिकता को समाप्त नहीं करता है जिसे आपने पहली बार एक कार्य कतार में पेश किया था?

  3. प्रीफ़ैचिंग को बंद क्यों नहीं किया जा सकता है? यह ज्यादातर मामलों में इसे बंद करने के लिए प्रदर्शन के लिए एक अच्छा विचार नहीं हो सकता है, लेकिन क्या इसके लिए कोई तकनीकी कारण संभव नहीं है? या यह सिर्फ लागू नहीं है?

  4. कभी-कभी, यह विकल्प जुड़ा होता है CELERY_ACKS_LATE। उदाहरण के लिए। रोजर हू लिखते हैं «[…] अक्सर क्या [उपयोगकर्ताओं] वास्तव में चाहते हैं कि एक कार्यकर्ता के पास केवल कई कार्य हों जैसे कि बाल प्रक्रियाएं हैं। लेकिन यह देर से स्वीकार किए बिना सक्षम होना संभव नहीं है [...] »मुझे समझ नहीं आता कि ये दो विकल्प कैसे जुड़े हैं और एक दूसरे के बिना संभव क्यों नहीं है। कनेक्शन का एक और उल्लेख यहां पाया जा सकता है । क्या कोई समझा सकता है कि दो विकल्प क्यों जुड़े हैं?

जवाबों:


32
  1. प्रीफ़ेचिंग प्रदर्शन में सुधार कर सकता है। श्रमिकों को प्रक्रिया के लिए ब्रोकर से अगले संदेश की प्रतीक्षा करने की आवश्यकता नहीं है। एक बार एक ब्रोकर के साथ संवाद करना और बहुत सारे संदेशों को संसाधित करना एक प्रदर्शन लाभ देता है। ब्रोकर से संदेश प्राप्त करना (यहां तक ​​कि स्थानीय से भी) स्थानीय मेमोरी एक्सेस की तुलना में महंगा है। श्रमिकों को बैचों में संदेश स्वीकार करने की भी अनुमति है

  2. शून्य पर सेट प्रीफेटिंग का मतलब असीमित के बजाय "कोई विशिष्ट सीमा नहीं" है

  3. 1 को प्रीफ़ेटिंग सेट करना इसे बंद करने के बराबर होने के लिए प्रलेखित है, लेकिन यह हमेशा ऐसा नहीं हो सकता (देखें https://stackoverflow.com/a/33357180/71522 )

  4. Prefetching बैचों में संदेशों को प्रसारित करने की अनुमति देता है। CELERY_ACKS_LATE = सच्चे संदेश को कार्यकर्ता तक पहुंचने से रोकता है


धन्यवाद। 2) ठीक है, लेकिन कोई 'कोई विशिष्ट सीमा' क्यों चाहेगा? 3) मुझे पूरा यकीन है कि मैं अभी भी "ब्रोकर से काम मिला" संदेशों को वर्तमान कार्य समाप्त होने से पहले देखता हूं।
हेनरिक हेमबर्गर 21

1
AFAIK, 1 से प्रीफ़ेटिंग सेट करना इसे बंद करने के बराबर नहीं है। प्रीफैच के लिए यह सबसे कम संभव मान है (स्रोत कोड को हैक नहीं करते हुए), जो बदले में, वर्तमान मशीन में सीपीयू / कोर की संख्या है।
रॉन क्लेन

1
@ रॉनकेलिन यह सीपीयू / कोर की संख्या नहीं है, यह आपके द्वारा परिभाषित सेलेरी श्रमिकों की संख्या है (जो कुछ मामलों में समान हो सकते हैं, लेकिन आमतौर पर नहीं)। इसके अलावा, यदि प्रत्येक कार्यकर्ता किसी एक कार्य को पूर्व निर्धारित कर रहा है, तो उसे निष्पादित कर रहा है, फिर दूसरे को प्रीफ़ेट करना, यह प्रीफ़ेटिंग को बंद करने के बराबर है, इसलिए IMHO आपका कथन गलत है। (सिस्टम को हमेशा कई कार्यों को प्राथमिकता देना चाहिए क्योंकि श्रमिक हैं यदि यह सभी श्रमिकों को कार्यों से
भरा

3
मुझे लगता है कि CELERYD_PREFETCH_MULTIPLIER 1 मूल रूप से 'लाने' का अर्थ है। जब मूल्य को> 1 पर सेट किया जाता है, तो प्री-फ़ेचिंग निहित होती है। इसलिए, 1 से अधिक प्रभावी कार्यों में 'पूर्व-नियोजित' किया जा रहा है।
tigeronk2

3
मैं कुछ प्रयोगों को चलाने की है, और सेटिंग्स (Redis दलाल के साथ कम से कम) CELERYD_PREFETCH_MULTIPLIER = 1करता नहीं अक्षम प्रीफेचिंग। यह बस - जैसा कि नाम से पता चलता है - केवल एक समय में एक कार्य को प्रीफ़ेट करता है।
डेविड वोलेवर

28

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

  1. सेट CELERYD_PREFETCH_MULTIPLIER = 1
  2. CELERY_ACKS_LATE = Trueवैश्विक स्तर या कार्य स्तर पर सेट करें
  3. -Ofairश्रमिकों को शुरू करते समय उपयोग करें
  4. यदि आप 1 के लिए संगामिति सेट करते हैं, तो चरण 3 की आवश्यकता नहीं है। यदि आप एक उच्च संगति चाहते हैं, तो चरण 3 आवश्यक है कि उन कार्यों से बचने के लिए जो एक नोड में लंबे समय तक चलने वाले कार्यों को चलाया जा सकता है।

कुछ और विवरण जोड़ना:

मैंने पाया कि वर्कर नोड हमेशा डिफ़ॉल्ट रूप से पूर्वनिर्मित होगा। आप केवल यह नियंत्रित कर सकते हैं कि यह कितने कार्यों का उपयोग करके पूर्व निर्धारित करता है CELERYD_PREFETCH_MULTIPLIER। यदि इसे 1 पर सेट किया जाता है, तो यह नोड में पूल वर्कर्स (कंसीडर) की संख्या के रूप में कई कार्यों को प्राथमिकता देगा। इसलिए यदि आपके पास समवर्ती = n है, तो नोड द्वारा पूर्व निर्धारित अधिकतम कार्य n होंगे।

-Ofairविकल्प के बिना , मेरे लिए क्या हुआ था कि यदि पूल कार्यकर्ता प्रक्रियाओं में से एक लंबे समय से चल रहे कार्य को निष्पादित कर रहा था, तो नोड में अन्य श्रमिक पहले से ही नोड द्वारा पूर्व निर्धारित कार्यों को संसाधित करना बंद कर देंगे। उपयोग करके -Ofair, वह बदल गया। हालाँकि, नोड में एक कर्मचारी लंबे समय से चल रहे कार्यों को अंजाम दे रहा है, अन्य लोग प्रसंस्करण बंद नहीं करेंगे और नोड द्वारा पूर्व निर्धारित कार्यों को संसाधित करना जारी रखेंगे। इसलिए मुझे प्रीफेटिंग के दो स्तर दिखाई देते हैं। कार्यकर्ता नोड स्तर पर एक। व्यक्तिगत कार्यकर्ता स्तर पर अन्य। -Ofairमेरे लिए उपयोग करना कार्यकर्ता स्तर पर इसे अक्षम करने के लिए लग रहा था।

कैसे ACKS_LATEसंबंधित है? ACKS_LATE = Trueइसका अर्थ है कि कार्य तभी सफल होगा जब कार्य सफल होगा। यदि नहीं, तो मुझे लगता है कि यह तब होगा जब इसे एक कार्यकर्ता द्वारा प्राप्त किया जाएगा। प्रीफ़ैच के मामले में, कार्य पहले कार्यकर्ता द्वारा प्राप्त किया जाता है (लॉग से पुष्टि की जाती है) लेकिन बाद में निष्पादित किया जाएगा । मुझे बस एहसास हुआ कि प्रीफ़ेट किए गए संदेश खरगोशों में "अनजाने संदेशों" के तहत दिखाई देते हैं। तो मुझे यकीन नहीं है कि अगर इसे सेट किया जाए तो Trueइसकी पूरी जरूरत है। हम वैसे भी अपने कार्यों को अन्य कारणों से इस तरह से निर्धारित कर रहे थे (देर से)।


इस सवाल में अभी भी योगदान देने के लिए धन्यवाद! क्या आप थोड़ा और विस्तार जोड़ सकते हैं? उदाहरण के लिए, आप लिख रहे हैं -Ofair"अलग प्रभाव", लेकिन प्रभाव अलग नहीं है। इसके अलावा, आप CELERY_ACKS_LATEअन्य लोगों के पहले की तरह काम कर रहे हैं , लेकिन अभी तक कोई भी मुझे यह समझाने में कामयाब नहीं हो सका है कि प्रीफेचिंग को अक्षम करने के साथ उस विशेषता का क्या करना है।
हेनरिक हेमबर्गर

मेरे पास यही मुद्दा था, एक रेडिस बैकएंड के साथ चल रहा था। मेरे पास 4 समवर्ती कार्य चल रहे थे और जब एक ने दूसरों को लटकाना शुरू कर दिया, तो वह एक के खत्म होने का इंतजार करेगा (यह नहीं होगा) - उस कार्यकर्ता को मारना फिर दूसरों को फिर से शुरू करने की अनुमति देगा। मेरे पास पहले से ही था prefetch=1, celery_acks=Trueऔर जब मैंने -Ofairइसे जोड़ा तो यह मुद्दा तय हो गया कि वे त्रिशंकु कार्यकर्ता की प्रतीक्षा कर रहे हैं। दुर्भाग्य से त्रिशंकु कार्यकर्ता मुद्दा अभी भी मेरे लिए तय नहीं है और इसलिए सभी श्रमिक अंततः लटके हुए हैं, लेकिन कम से कम वे अब ठीक उसी समय पर नहीं करते हैं।
जिम्नीरिकेट

18

बस एक चेतावनी: रेडिस ब्रोकर + सेलेरी 3.1.15 के साथ मेरे परीक्षण के रूप में, मैंने जो सलाह दी है कि मैं प्रीफेटिंग को CELERYD_PREFETCH_MULTIPLIER = 1अक्षम करने से संबंधित हूं, वह सभी गलत है।

इसे प्रदर्शित करने के लिए:

  1. सेट CELERYD_PREFETCH_MULTIPLIER = 1
  2. 5 ऐसे कार्य करें जो प्रत्येक कुछ सेकंड (उदा। time.sleep(5)) करेंगे
  3. Redis में कार्य कतार की लंबाई देखना शुरू करें: watch redis-cli -c llen default

  4. शुरू celery worker -c 1

  5. सूचना है कि Redis में कतार की लंबाई तुरंत से छोड़ देंगे 5करने के लिए3

CELERYD_PREFETCH_MULTIPLIER = 1 प्रीफ़ेटिंग को रोकता नहीं है , यह केवल प्रीफ़ेचिंग को 1 कार्य प्रति पंक्ति तक सीमित करता है।

-Ofair, क्या प्रलेखन कहते हैं के बावजूद , यह भी प्रीफ़ेचिंग नहीं रोकता है

स्रोत कोड को संशोधित करने की कमी, मुझे प्रीफ़ैचिंग को पूरी तरह से अक्षम करने के लिए कोई विधि नहीं मिली है।


1
जैसा कि अन्य उत्तरों ने उल्लेख किया है कि यदि आप भी सेट करते हैं CELERY_ACKS_LATE = 1तो आप प्रभावी रूप से प्रीफ़ेटिंग को अक्षम कर देंगे।
०४ पर जूलैग

11

मैं डेविड वोलेवर के उत्तरों पर टिप्पणी नहीं कर सकता, क्योंकि मेरा स्टैकक्रेड पर्याप्त नहीं है। इसलिए, मैंने अपनी टिप्पणी को एक उत्तर के रूप में तैयार किया है क्योंकि मैं अपना अनुभव अजवाइन 3.1.18 और एक मोंगोद ब्रोकर के साथ साझा करना चाहता हूं। मैंने निम्नलिखित के साथ प्रीफ़ेटिंग को रोकने में कामयाब रहा:

  1. CELERYD_PREFETCH_MULTIPLIER = 1अजवाइन विन्यास में जोड़ें
  2. CELERY_ACKS_LATE = Trueअजवाइन विन्यास में जोड़ें
  3. विकल्पों के साथ अजवाइन कार्यकर्ता शुरू करें: --concurrency=1 -Ofair

CELERY_ACKS_LATE को डिफ़ॉल्ट पर छोड़कर, कार्यकर्ता अभी भी प्रीफ़ेट करता है। ओपी की तरह मैं प्रीफ़ैचिंग और लेट एक्स के बीच लिंक को पूरी तरह से समझ नहीं पाता। मुझे समझ में आया कि डेविड क्या कहता है "CELERY_ACKS_LATE = सच्चे संदेश को स्वीकार करने से रोकता है जब वे एक कार्यकर्ता तक पहुंचते हैं", लेकिन मैं यह समझने में विफल रहता हूं कि देर से आने वाले प्रीफ़च के साथ असंगत क्यों होंगे। सिद्धांत रूप में एक प्रीफ़ैच अभी भी देर से सही होने की अनुमति देगा - भले ही अजवाइन में ऐसा कोडित न हो?


2

मैंने ब्रोकर के रूप में एसक्यूएस के साथ कुछ अलग सा अनुभव किया।

सेटअप था:

CELERYD_PREFETCH_MULTIPLIER = 1
ACKS_ON_FAILURE_OR_TIMEOUT=False
CELERY_ACKS_LATE = True
CONCURRENCY=1

टास्क फेल होने (अपवाद को उठाया गया) के बाद, कार्यकर्ता अनुपलब्ध हो गया क्योंकि संदेश स्थानीय और दूरस्थ कतार दोनों नहीं था।

श्रमिकों को उपभोग कार्य जारी रखने वाला समाधान सेटिंग था

CELERYD_PREFETCH_MULTIPLIER = 0

मैं केवल यह अनुमान लगा सकता हूं कि SQS परिवहन लिखते समय acks_late को ध्यान में नहीं लिया गया था


मैंने इस मामले को संभालने वाला एक PR बनाया, यह अजवाइन में उपलब्ध होगा == 4.4.0 github.com/celery/celery/pull/5843
gCoh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.