मेरे पास अपना स्वयं का बहुप्रचारित सी प्रोग्राम है जो सीपीयू कोर की संख्या के साथ आसानी से गति में स्केल करता है .. मैं इसे 1, 2, 3, आदि थ्रेड के साथ चला सकता हूं और प्राप्त कर सकता हूं रैखिक गति .. उबंटू लिनक्स बॉक्स पर 6-कोर सीपीयू पर लगभग 5.5x की गति तक।लिनक्स प्रति-प्रक्रिया संसाधन सीमाएं - एक गहरी रेड हैट रहस्य
मुझे प्रोग्राम को चलाने के लिए एक उच्च अंत सनफियर x4450 पर 4 क्वाड-कोर ज़ीऑन प्रोसेसर के साथ चलाने का अवसर था, जो Red Hat Enterprise Linux चला रहा था। मैं बेसब्री से उम्मीद कर रहा था कि 16 कोर मेरे कार्यक्रम को 16 धागे के साथ कितनी तेजी से चला सकते हैं .. लेकिन यह केवल दो धागे के समान गति से चलता है!
बाद में बहुत सारे बाल खींचने और डिबगिंग, मैं देखता हूं कि मेरा प्रोग्राम वास्तव में सभी धागे बना रहा है, वे वास्तव में एक साथ चल रहे हैं, लेकिन थ्रेड स्वयं जितना धीमा हो उतना धीमा हो। 2 धागे 1 से तेज 1.7x चलाते हैं, लेकिन 3, 4, 8, 10, 16 धागे सभी नेट 1.9x पर चलते हैं! मैं देख सकता हूं कि सभी धागे चल रहे हैं (रुक गए या सोए नहीं), वे बस धीमे हैं।
यह जांचने के लिए कि हार्डवेयरवेयर गलती नहीं है, मैं अपने कार्यक्रम की सिक्सटेन प्रतियां स्वतंत्र रूप से एक साथ चला गया। वे सभी पूरी गति से भाग गए। वास्तव में 16 कोर हैं और वे वास्तव में पूरी गति से दौड़ते हैं और वास्तव में पर्याप्त रैम है (वास्तव में इस मशीन में 64 जीबी है, और मैं केवल 1 जीबी प्रति प्रक्रिया का उपयोग करता हूं)।
तो, मेरा सवाल यह है कि अगर कुछ ऑपरेटिंग सिस्टम स्पष्टीकरण है, तो शायद कुछ प्रति-प्रक्रिया संसाधन सीमा जो स्वचालित रूप से मशीन को हॉगिंग से एक प्रक्रिया को रखने के लिए थ्रेड शेड्यूलिंग को वापस ले जाती है।
सुराग हैं:
- मेरे कार्यक्रम डिस्क या नेटवर्क तक पहुंच नहीं है। यह सीपीयू सीमित है। उबंटू लिनक्स में के साथ 1-6 धागे के लिए एक हेक्साकोर i7 के साथ एकल सीपीयू बॉक्स पर इसकी गति स्केल रैखिक रूप से। 6 धागे प्रभावी ढंग से 6x गतिशील है।
- मेरा प्रोग्राम इस 16 कोर सनफायर ज़ीऑन बॉक्स पर से 2-16 से 2x स्पीडअप से अधिक तेज़ नहीं चलता है।
- की 16 प्रतियां चलाना मेरे प्रोग्राम सिंगल थ्रेडेड पूरी तरह से चलाता है, सभी 16 एक बार पूर्ण गति पर चलते हैं।
- शीर्ष शो 1612% आवंटित CPUs दिखाता है।/proc/cpuinfo दिखाता है सभी 16 कोर पूर्ण 2.9GHz गति (कम आवृत्ति निष्क्रिय गति 1.6GHz की गति नहीं)
- 48 जीबी रैम मुक्त है, यह स्वैपिंग नहीं है।
क्या हो रहा है? क्या कुछ प्रक्रिया सीपीयू सीमा नीति है? यदि मैं ऐसा कर सकता हूं तो मैं इसे कैसे माप सकता हूं? इस व्यवहार को और क्या समझा सकता है?
2010 के ग्रेट ज़ीऑन स्लोडाउन मिस्ट्री को हल करने के आपके विचारों के लिए धन्यवाद!
इनमें से अधिकतर अंक उत्कृष्ट हैं और मैंने पहले देखा है। लेकिन तथ्य यह है कि पूर्ण गति से 16 अलग-अलग प्रतियां चलती हैं इसका मतलब है कि यह एक सीपीयू, मेमोरी, हाइपरथ्रेडिंग या वर्चुअलाइजेशन इश्यू नहीं है। अब मुझे आश्वस्त है कि यह एक प्रोग्रामिंग मुद्दा नहीं है, लेकिन कुछ ओएस संबंधित है, लेकिन मुझे नहीं पता कि कहां देखना है। एक नया ओएस स्थापित करना स्पष्ट रूप से एक महान परीक्षण होगा, सिवाय इसके कि यह $ 22,000 सनफ़ीयर सर्वर पर है, जिसके पास मेरे पास पहुंच है लेकिन इसका स्वामित्व नहीं है। –