जवाबों:
यह एक जटिल प्रश्न है जो आप पूछ रहे हैं। आपके थ्रेड्स की प्रकृति के बारे में अधिक जानकारी के बिना यह कहना मुश्किल है। सिस्टम प्रदर्शन का निदान करते समय कुछ बातों पर ध्यान देना चाहिए:
प्रक्रिया / धागा है
ये तीनों संसाधन सीमित हैं और कोई भी एक प्रणाली के प्रदर्शन को सीमित कर सकता है। आपको यह देखने की जरूरत है कि आपकी विशेष स्थिति में कौन सी (2 या 3 एक साथ) हो सकती है।
आप उपयोग कर सकते हैं ntop
और iostat
, और vmstat
निदान करने के लिए कि क्या हो रहा है।
"ऐसा क्यों होता है?" जवाब देना आसान है। कल्पना कीजिए कि आपके पास एक गलियारा है जिसे आप चार लोगों को नीचे की तरफ फिट कर सकते हैं। आप सभी बकवास को एक छोर पर, दूसरे छोर पर ले जाना चाहते हैं। लोगों की सबसे कुशल संख्या 4 है।
यदि आपके पास 1-3 लोग हैं तो आप कुछ गलियारे की जगह का उपयोग करने से चूक रहे हैं। यदि आपके पास 5 या अधिक लोग हैं, तो कम से कम उन लोगों में से एक मूल रूप से हर समय किसी अन्य व्यक्ति के पीछे कतार में फंस जाता है। अधिक से अधिक लोगों को जोड़ना सिर्फ गलियारे को बंद कर देता है, यह तीक्ष्णता को गति नहीं देता है।
इसलिए आप बिना किसी कतार के बिना जितने लोगों को फिट कर सकते हैं, उतने लोग हैं। आपके पास क्यूइंग (या अड़चन) क्यों है , यह स्लम के उत्तर के प्रश्नों पर निर्भर करता है।
4
सबसे अच्छी संख्या है।
एक सामान्य अनुशंसा n + 1 थ्रेड्स है, जो उपलब्ध CPU कोर की संख्या है। इस तरह n थ्रेड्स CPU काम कर सकते हैं जबकि 1 थ्रेड डिस्क I / O की प्रतीक्षा कर रहा है। कम धागे होने से पूरी तरह से CPU संसाधन का उपयोग नहीं होगा (कुछ बिंदु पर हमेशा I / O का इंतजार करना होगा), अधिक धागे होने से CPU संसाधन पर लड़ रहे थ्रेड का कारण होगा।
थ्रेड्स मुक्त नहीं आते हैं, लेकिन संदर्भ स्विच जैसे ओवरहेड के साथ, और - यदि डेटा को थ्रेड्स के बीच आदान-प्रदान करना पड़ता है जो आमतौर पर मामला है - विभिन्न लॉकिंग तंत्र। यह केवल उस लागत के लायक है जब आपके पास कोड चलाने के लिए वास्तव में अधिक समर्पित सीपीयू कोर हो। सिंगल कोर सीपीयू पर, एक एकल प्रक्रिया (कोई अलग थ्रेड) आमतौर पर किए गए किसी भी थ्रेडिंग की तुलना में तेज़ नहीं होती है। थ्रेड्स जादुई रूप से आपके सीपीयू को किसी भी तेजी से आगे नहीं बढ़ाते हैं, इसका मतलब सिर्फ अतिरिक्त काम है।
जैसा कि अन्य ने बताया है ( slm उत्तर , EightBitTony उत्तर ) यह एक पेचीदा प्रश्न है और अधिक से अधिक इसलिए कि आप यह वर्णन नहीं करते कि आपने क्या किया और वे इसे कैसे करते हैं।
लेकिन निश्चित रूप से अधिक धागे में फेंकने से चीजें खराब हो सकती हैं।
समानांतर कंप्यूटिंग के क्षेत्र में अमदहल का नियम है जो लागू हो सकता है (या नहीं, लेकिन आप समस्या के विवरण का वर्णन नहीं करते हैं, इसलिए ....) और समस्याओं के इस वर्ग के बारे में कुछ सामान्य जानकारी दे सकते हैं।
Amdahl के नियम की बात यह है कि किसी भी कार्यक्रम में (किसी भी एल्गोरिथम में) हमेशा एक प्रतिशत होता है जिसे समानांतर ( क्रमिक भाग) में नहीं चलाया जा सकता है ) है और एक और प्रतिशत है जो समानांतर ( समानांतर भाग ) में चलाया जा सकता है [जाहिर है ये दोनों भाग 100% तक बढ़ जाते हैं]।
इस हिस्से को निष्पादन समय के प्रतिशत के रूप में व्यक्त किया जा सकता है। उदाहरण के लिए, सख्ती से अनुक्रमिक संचालन में 25% समय खर्च किया जा सकता है, और शेष 75% समय उस ऑपरेशन में खर्च किया जाता है जिसे समानांतर में निष्पादित किया जा सकता है।
(चित्र विकिपीडिया से )
Amdahl के नियम का अनुमान है कि किसी प्रोग्राम के हर दिए गए समानान्तर हिस्से (जैसे 75%) के लिए आप अभी तक निष्पादन को गति दे सकते हैं (जैसे कि अधिकतम 4 बार) यदि आप काम करने के लिए अधिक से अधिक प्रोसेसर का उपयोग करते हैं।
अंगूठे के एक नियम के रूप में, आप जितना अधिक प्रोग्राम करते हैं, आप समानांतर निष्पादन में नहीं बदल सकते हैं, उतना कम आप अधिक निष्पादन इकाइयों (प्रोसेसर) का उपयोग करके प्राप्त कर सकते हैं।
यह देखते हुए कि आप थ्रेड्स का उपयोग कर रहे हैं (और भौतिक प्रोसेसर नहीं) स्थिति इससे भी बदतर हो सकती है। याद रखें कि थ्रेड्स को संसाधित किया जा सकता है (उपलब्ध कार्यान्वयन और हार्डवेयर के आधार पर, उदाहरण के लिए सीपीयू / कोर) साझाकरण एक ही भौतिक प्रोसेसर / कोर करना (यह मल्टीटास्किंग का एक रूप है, जैसा कि एक अन्य उत्तर में बताया गया है)।
यह टेस्टोरिकल भविष्यवाणी (सीपीयू समय के बारे में) दूसरों को व्यावहारिक अड़चनों के रूप में नहीं मानती है
यह आसानी से व्यावहारिक अनुप्रयोगों में सीमित कारक हो सकता है।
यहां अपराधी को "संपर्क स्विचिंग" होना चाहिए। यह वर्तमान थ्रेड की स्थिति को बचाने के लिए एक और थ्रेड निष्पादित करना शुरू करने की प्रक्रिया है। यदि कई थ्रेड्स को एक ही प्राथमिकता दी जाती है, तो उन्हें निष्पादन समाप्त होने तक चारों ओर स्विच करने की आवश्यकता होती है।
आपके मामले में, जब 50 थ्रेड होते हैं तो केवल 10 थ्रेड चलाने की तुलना में बहुत सारे संदर्भ स्विचिंग होते हैं।
इस बार ओवरहेड को संदर्भ स्विचिंग के कारण पेश किया गया है जो आपके प्रोग्राम को धीमा बना रहा है
ps ax | wc -l
225 प्रक्रियाओं की रिपोर्ट करता है, और यह किसी भी तरह से भारी लोड से नहीं है)। मैं @ EightBitTony के अनुमान के साथ जाने के लिए इच्छुक हूं; कैश अमान्य होना एक बड़ा मुद्दा है, क्योंकि हर बार जब आप कैश फ्लश करते हैं, तो सीपीयू को रैम से कोड और डेटा के लिए ईन्स का इंतजार करना पड़ता है ।
आठबीटोनी के रूपक को ठीक करने के लिए:
"ऐसा क्यों होता है?" जवाब देना आसान है। कल्पना कीजिए कि आपके पास दो स्विमिंग पूल हैं, एक पूर्ण और एक खाली है। आप सभी पानी को एक से दूसरे में स्थानांतरित करना चाहते हैं, और 4 बाल्टी हैं । लोगों की सबसे कुशल संख्या 4 है।
यदि आपके पास 1-3 लोग हैं तो आप कुछ बाल्टियों का उपयोग करने से चूक रहे हैं । यदि आपके पास 5 या अधिक लोग हैं, तो कम से कम उन लोगों में से एक बाल्टी के लिए इंतजार कर रहा है । अधिक से अधिक लोगों को जोड़ना ... गतिविधि को गति नहीं देता है।
इसलिए आप चाहते हैं कि जितने लोग काम कर सकें (एक बाल्टी का उपयोग करें) एक साथ कर सकें ।
यहां एक व्यक्ति एक धागा है, और एक बाल्टी जो भी निष्पादन संसाधन का प्रतिनिधित्व करता है वह अड़चन है। यदि वे कुछ भी नहीं कर सकते हैं तो अधिक धागे जोड़ना मदद नहीं करता है। इसके अतिरिक्त, हमें इस बात पर जोर देना चाहिए कि एक व्यक्ति से दूसरे व्यक्ति के लिए एक बाल्टी पास करना आमतौर पर एक ही व्यक्ति की तुलना में धीमी गति से होता है, केवल बाल्टी को समान दूरी पर ले जाना। यही है, दो धागे एक कोर को चालू करते हैं, आमतौर पर एक ही धागे से दो बार चलने के बजाय कम काम पूरा करते हैं: ऐसा इसलिए है क्योंकि दो थ्रेड्स के बीच स्विच करने के लिए किए गए अतिरिक्त काम।
क्या सीमित निष्पादन संसाधन (बाल्टी) एक सीपीयू, या एक कोर है, या आपके उद्देश्यों के लिए एक हाइपर-थ्रेडेड निर्देश पाइपलाइन इस बात पर निर्भर करता है कि वास्तुकला का कौन सा हिस्सा आपका सीमित कारक है। ध्यान दें कि हम मान रहे हैं कि धागे पूरी तरह से स्वतंत्र हैं। यह केवल मामला है अगर वे कोई डेटा साझा नहीं करते हैं (और किसी भी कैश टकराव से बचते हैं)।
जैसा कि कुछ लोगों ने सुझाव दिया है, I / O के लिए सीमित संसाधन उपयोगी I / O संचालन की संख्या के बराबर हो सकता है: यह हार्डवेयर और कर्नेल कारकों की पूरी मेजबानी पर निर्भर हो सकता है, लेकिन आसानी से संख्या से अधिक हो सकता है कोर। इधर, संदर्भ स्विच जो निष्पादित-बाध्य कोड की तुलना में बहुत महंगा है, आई / ओ बाध्य कोड की तुलना में बहुत सस्ता है। दुख की बात है कि मुझे लगता है कि अगर मैं बाल्टी के साथ इसे सही ठहराने की कोशिश करता हूं तो रूपक पूरी तरह से नियंत्रण से बाहर हो जाएगा।
ध्यान दें कि इष्टतम आई / ओ बाध्य कोड के साथ व्यवहार आमतौर पर है अभी भी प्रति पाइपलाइन / कोर / सीपीयू सबसे एक धागा पर है। हालाँकि, आपको एसिंक्रोनस या सिंक्रोनस / नॉन-ब्लॉकिंग I / O कोड लिखना होगा, और अपेक्षाकृत छोटा प्रदर्शन सुधार हमेशा अतिरिक्त जटिलता को सही नहीं ठहराएगा।
पुनश्च। मूल कॉरिडोर रूपक के साथ मेरी समस्या यह है कि यह दृढ़ता से सुझाव देता है कि आप लोगों की 4 कतारें होने में सक्षम होना चाहिए, जिसमें 2 कतारों को रगड़कर और 2 को इकट्ठा करने के लिए वापस जाना होगा। फिर आप प्रत्येक कतार को लगभग कॉरिडोर के रूप में लंबे समय तक बना सकते हैं, और लोगों को जोड़कर एल्गोरिथ्म को गति दी (आपने मूल रूप से पूरे कॉरिडोर को एक कन्वेयर बेल्ट में बदल दिया)।
वास्तव में यह परिदृश्य टीसीपी नेटवर्किंग में विलंबता और खिड़की के आकार के बीच संबंध के मानक विवरण के समान है, यही वजह है कि यह मेरे लिए उछल गया।
यह समझने में बहुत सरल और सरल है। आपके CPU का समर्थन करने से अधिक थ्रेड्स होने से आप वास्तव में क्रमबद्ध हो रहे हैं और समानांतर नहीं हैं। आपके पास जितने अधिक थ्रेड होंगे आपका सिस्टम उतना ही धीमा होगा। आपके परिणाम वास्तव में इस घटना का प्रमाण हैं।