क्यों अधिक थ्रेड्स का उपयोग करना कम थ्रेड्स का उपयोग करने की तुलना में धीमा बनाता है


30

8 थ्रेड का उपयोग करके प्रोग्राम X को चलाने की कोशिश की गई और यह n मिनट में खत्म हो गया । 50 थ्रेड
का उपयोग करके एक ही प्रोग्राम चलाने की कोशिश की गई और यह n * 10 मिनट में खत्म हो गया ।

ऐसा क्यों होता है और मैं उपयोग किए जा सकने वाले धागों की अधिकतम संख्या कैसे प्राप्त कर सकता हूँ?

जवाबों:


33

यह एक जटिल प्रश्न है जो आप पूछ रहे हैं। आपके थ्रेड्स की प्रकृति के बारे में अधिक जानकारी के बिना यह कहना मुश्किल है। सिस्टम प्रदर्शन का निदान करते समय कुछ बातों पर ध्यान देना चाहिए:

प्रक्रिया / धागा है

  • CPU बाउंड (CPU संसाधनों की बहुत आवश्यकता है)
  • मेमोरी बाउंड (RAM संसाधनों की बहुत आवश्यकता है)
  • I / O बाध्य (नेटवर्क और / या हार्ड ड्राइव संसाधन)

ये तीनों संसाधन सीमित हैं और कोई भी एक प्रणाली के प्रदर्शन को सीमित कर सकता है। आपको यह देखने की जरूरत है कि आपकी विशेष स्थिति में कौन सी (2 या 3 एक साथ) हो सकती है।

आप उपयोग कर सकते हैं ntopऔर iostat, और vmstatनिदान करने के लिए कि क्या हो रहा है।


8
हार्डवेयर भी मायने रखता है। भौतिक, आभासी, कोर की संख्या, कोर का प्रकार, L1 / L2 / L3 कैश, इत्यादि
EightBitTony

46

"ऐसा क्यों होता है?" जवाब देना आसान है। कल्पना कीजिए कि आपके पास एक गलियारा है जिसे आप चार लोगों को नीचे की तरफ फिट कर सकते हैं। आप सभी बकवास को एक छोर पर, दूसरे छोर पर ले जाना चाहते हैं। लोगों की सबसे कुशल संख्या 4 है।

यदि आपके पास 1-3 लोग हैं तो आप कुछ गलियारे की जगह का उपयोग करने से चूक रहे हैं। यदि आपके पास 5 या अधिक लोग हैं, तो कम से कम उन लोगों में से एक मूल रूप से हर समय किसी अन्य व्यक्ति के पीछे कतार में फंस जाता है। अधिक से अधिक लोगों को जोड़ना सिर्फ गलियारे को बंद कर देता है, यह तीक्ष्णता को गति नहीं देता है।

इसलिए आप बिना किसी कतार के बिना जितने लोगों को फिट कर सकते हैं, उतने लोग हैं। आपके पास क्यूइंग (या अड़चन) क्यों है , यह स्लम के उत्तर के प्रश्नों पर निर्भर करता है।


1
आपका उदाहरण भ्रामक है। कुछ कहना बेहतर होगा: "आपके पास एक गलियारा है जिसे आप चार लोगों को नीचे की तरफ फिट कर सकते हैं और इसका उपयोग आपके और अन्य लोगों द्वारा विभिन्न कार्यों के लिए किया जाता है । एक रेफरी है जो यह तय करता है कि गलियारे के माध्यम से कौन जा सकता है। तब लोगों की सबसे कुशल संख्या 4 से बड़ी है और कुछ संख्या से कम है, जहां आपके लोग कतार में लग जाते हैं [अत्यधिक संदर्भ पर निर्भर]। " आम तौर पर कुछ धागे अधिक CPUs प्रदर्शन की संख्या की तुलना का उपयोग कर की तुलना में बेहतर होने वास्तव में 4 धागे। यदि आप सीपीयू का उपयोग करने वाले एकमात्र हैं , तो 4सबसे अच्छी संख्या है।
बकुरी

7
महान उदाहरण, +1। बाकुरी, इसका एक उदाहरण जो एक सीमित साझा संसाधन की समस्या को दर्शाता है। यह समस्या की व्याख्या कर रहा है, न कि थ्रेड्स की इष्टतम संख्या को खोजने के लिए।
बनगुंगिन

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

9
हर समस्या को जटिलता के कई स्तरों पर वर्णित किया जा सकता है। मैंने समस्या का एक अनुमान प्रस्तुत किया है, जो मुझे लगता है कि मूल बातें समझाने के लिए उपयोगी है। बेशक यह अधिक परिष्कृत हो सकता है, और अधिक विस्तृत हो सकता है, लेकिन जितना अधिक आप इसे बनाते हैं, उतना कम उपयोगी होता है कि यह मुद्दे की शुरूआत के रूप में हो।
आठबेटटोनी

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

20

एक सामान्य अनुशंसा n + 1 थ्रेड्स है, जो उपलब्ध CPU कोर की संख्या है। इस तरह n थ्रेड्स CPU काम कर सकते हैं जबकि 1 थ्रेड डिस्क I / O की प्रतीक्षा कर रहा है। कम धागे होने से पूरी तरह से CPU संसाधन का उपयोग नहीं होगा (कुछ बिंदु पर हमेशा I / O का इंतजार करना होगा), अधिक धागे होने से CPU संसाधन पर लड़ रहे थ्रेड का कारण होगा।

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


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

9

जैसा कि अन्य ने बताया है ( slm उत्तर , EightBitTony उत्तर ) यह एक पेचीदा प्रश्न है और अधिक से अधिक इसलिए कि आप यह वर्णन नहीं करते कि आपने क्या किया और वे इसे कैसे करते हैं।

लेकिन निश्चित रूप से अधिक धागे में फेंकने से चीजें खराब हो सकती हैं।

समानांतर कंप्यूटिंग के क्षेत्र में अमदहल का नियम है जो लागू हो सकता है (या नहीं, लेकिन आप समस्या के विवरण का वर्णन नहीं करते हैं, इसलिए ....) और समस्याओं के इस वर्ग के बारे में कुछ सामान्य जानकारी दे सकते हैं।

Amdahl के नियम की बात यह है कि किसी भी कार्यक्रम में (किसी भी एल्गोरिथम में) हमेशा एक प्रतिशत होता है जिसे समानांतर ( क्रमिक भाग) में नहीं चलाया जा सकता है ) है और एक और प्रतिशत है जो समानांतर ( समानांतर भाग ) में चलाया जा सकता है [जाहिर है ये दोनों भाग 100% तक बढ़ जाते हैं]।

इस हिस्से को निष्पादन समय के प्रतिशत के रूप में व्यक्त किया जा सकता है। उदाहरण के लिए, सख्ती से अनुक्रमिक संचालन में 25% समय खर्च किया जा सकता है, और शेष 75% समय उस ऑपरेशन में खर्च किया जाता है जिसे समानांतर में निष्पादित किया जा सकता है।

विकिपीडिया से छवि (चित्र विकिपीडिया से )

Amdahl के नियम का अनुमान है कि किसी प्रोग्राम के हर दिए गए समानान्तर हिस्से (जैसे 75%) के लिए आप अभी तक निष्पादन को गति दे सकते हैं (जैसे कि अधिकतम 4 बार) यदि आप काम करने के लिए अधिक से अधिक प्रोसेसर का उपयोग करते हैं।

अंगूठे के एक नियम के रूप में, आप जितना अधिक प्रोग्राम करते हैं, आप समानांतर निष्पादन में नहीं बदल सकते हैं, उतना कम आप अधिक निष्पादन इकाइयों (प्रोसेसर) का उपयोग करके प्राप्त कर सकते हैं।

यह देखते हुए कि आप थ्रेड्स का उपयोग कर रहे हैं (और भौतिक प्रोसेसर नहीं) स्थिति इससे भी बदतर हो सकती है। याद रखें कि थ्रेड्स को संसाधित किया जा सकता है (उपलब्ध कार्यान्वयन और हार्डवेयर के आधार पर, उदाहरण के लिए सीपीयू / कोर) साझाकरण एक ही भौतिक प्रोसेसर / कोर करना (यह मल्टीटास्किंग का एक रूप है, जैसा कि एक अन्य उत्तर में बताया गया है)।

यह टेस्टोरिकल भविष्यवाणी (सीपीयू समय के बारे में) दूसरों को व्यावहारिक अड़चनों के रूप में नहीं मानती है

  1. सीमित I / O गति (हार्ड डिस्क और नेटवर्क "गति")
  2. मेमोरी साइज लिमिट
  3. अन्य लोग

यह आसानी से व्यावहारिक अनुप्रयोगों में सीमित कारक हो सकता है।


यह चयनित उत्तर होना चाहिए।
Eonil

6

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

आपके मामले में, जब 50 थ्रेड होते हैं तो केवल 10 थ्रेड चलाने की तुलना में बहुत सारे संदर्भ स्विचिंग होते हैं।

इस बार ओवरहेड को संदर्भ स्विचिंग के कारण पेश किया गया है जो आपके प्रोग्राम को धीमा बना रहा है


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

धागा स्विचिंग संदर्भ में और स्वयं का , जब तक कि हम एक साथ काम कर रहे विशाल संदर्भ स्विच की संख्या, संभावना के प्रदर्शन पर एक आदेश के-परिमाण असर नहीं पड़ेगा। 50 थ्रेड्स उच्च हैं, लेकिन अति नहीं (अभी मेरे बॉक्स पर, ps ax | wc -l225 प्रक्रियाओं की रिपोर्ट करता है, और यह किसी भी तरह से भारी लोड से नहीं है)। मैं @ EightBitTony के अनुमान के साथ जाने के लिए इच्छुक हूं; कैश अमान्य होना एक बड़ा मुद्दा है, क्योंकि हर बार जब आप कैश फ्लश करते हैं, तो सीपीयू को रैम से कोड और डेटा के लिए ईन्स का इंतजार करना पड़ता है ।
बजे एक CVn

3

आठबीटोनी के रूपक को ठीक करने के लिए:

"ऐसा क्यों होता है?" जवाब देना आसान है। कल्पना कीजिए कि आपके पास दो स्विमिंग पूल हैं, एक पूर्ण और एक खाली है। आप सभी पानी को एक से दूसरे में स्थानांतरित करना चाहते हैं, और 4 बाल्टी हैं । लोगों की सबसे कुशल संख्या 4 है।

यदि आपके पास 1-3 लोग हैं तो आप कुछ बाल्टियों का उपयोग करने से चूक रहे हैं । यदि आपके पास 5 या अधिक लोग हैं, तो कम से कम उन लोगों में से एक बाल्टी के लिए इंतजार कर रहा है । अधिक से अधिक लोगों को जोड़ना ... गतिविधि को गति नहीं देता है।

इसलिए आप चाहते हैं कि जितने लोग काम कर सकें (एक बाल्टी का उपयोग करें) एक साथ कर सकें

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

क्या सीमित निष्पादन संसाधन (बाल्टी) एक सीपीयू, या एक कोर है, या आपके उद्देश्यों के लिए एक हाइपर-थ्रेडेड निर्देश पाइपलाइन इस बात पर निर्भर करता है कि वास्तुकला का कौन सा हिस्सा आपका सीमित कारक है। ध्यान दें कि हम मान रहे हैं कि धागे पूरी तरह से स्वतंत्र हैं। यह केवल मामला है अगर वे कोई डेटा साझा नहीं करते हैं (और किसी भी कैश टकराव से बचते हैं)।

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

ध्यान दें कि इष्टतम आई / ओ बाध्य कोड के साथ व्यवहार आमतौर पर है अभी भी प्रति पाइपलाइन / कोर / सीपीयू सबसे एक धागा पर है। हालाँकि, आपको एसिंक्रोनस या सिंक्रोनस / नॉन-ब्लॉकिंग I / O कोड लिखना होगा, और अपेक्षाकृत छोटा प्रदर्शन सुधार हमेशा अतिरिक्त जटिलता को सही नहीं ठहराएगा।


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

वास्तव में यह परिदृश्य टीसीपी नेटवर्किंग में विलंबता और खिड़की के आकार के बीच संबंध के मानक विवरण के समान है, यही वजह है कि यह मेरे लिए उछल गया।


यह एक रूपक नहीं है, यह लोगों को सिस्टम को इस तरह से समझाने के लिए बनाया गया एक अंदाज है कि वे इसे आसानी से देख सकते हैं। इस प्रकार, यह हमेशा उन लोगों द्वारा 'बकवास' होने जा रहा है, जिन्हें विस्तार के अगले स्तर का पता है, लेकिन उन्हें इस बात का एहसास नहीं है कि उनके स्तर का विस्तार वास्तव में शुरुआती लोगों के लिए आवश्यक नहीं है। कोई भी पीएचडी स्तर पर शुरू करके कण भौतिकी नहीं सीखता है। इससे पहले कि वे जाते हैं, इसे परिष्कृत करते हुए सभी सामान एक सन्निकटन है जो वे आपको धीरे-धीरे इसमें ले जाते हैं। यह 'गलत' नहीं है यह पूरी तस्वीर नहीं है।
आठबेटटोनी

कोई भी व्यक्ति भ्रमित नहीं है कि आपने किस भाषण का उपयोग किया है, और यह एक बुरा सादृश्य नहीं है। प्रत्येक सादृश्य की कुछ सीमा होती है जिसके आगे वह उस वस्तु से भिन्न होता है जिसे वह वर्णन करना चाहता है और उपयोगी होना बंद कर देता है। मैंने केवल इसका उल्लेख किया है क्योंकि मूल ने मुझे एक अलग परिदृश्य की दृढ़ता से याद दिलाया है, और क्योंकि मुझे नहीं लगता कि इस संस्करण के लिए (उम्मीद है) बेहतर भविष्यवाणी के लिए कोई और अधिक जटिल है।
बेकार

0

यह समझने में बहुत सरल और सरल है। आपके CPU का समर्थन करने से अधिक थ्रेड्स होने से आप वास्तव में क्रमबद्ध हो रहे हैं और समानांतर नहीं हैं। आपके पास जितने अधिक थ्रेड होंगे आपका सिस्टम उतना ही धीमा होगा। आपके परिणाम वास्तव में इस घटना का प्रमाण हैं।

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