2013-04-16 28 views
51

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

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

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

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

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

उत्तर

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

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

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

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

+0

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

+1

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

+1

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

13

बस एक चेतावनी तक पहुँचने: redis दलाल + अजवाइन 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 में कतार की लंबाई तुरंत 3

CELERYD_PREFETCH_MULTIPLIER = 1को 5 से ड्रॉप प्रीफ़ेचिंग नहीं रोकता है, यह बस कतार प्रति 1 कार्य करने के लिए प्रीफेचिंग सीमित करता है।

-Ofair, despite what the documentation says, प्रीफेचिंग को रोकता नहीं है।

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

+0

जैसा कि अन्य उत्तरों ने उल्लेख किया है कि क्या आप ' CELERY_ACKS_LATE = 1' फिर आप प्रभावी ढंग से प्रीफेचिंग अक्षम कर देंगे। – jodag

5

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

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

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

11

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

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

जोड़ा जा रहा है कुछ और जानकारी:

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

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

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

+0

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

+0

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

संबंधित मुद्दे