2013-02-15 51 views
8

सिस्टम लिनक्स (जेनेटू x64) है, कोड सी ++ है। मेरे पास एक डिमन एप्लिकेशन है, जिसमें से कई उदाहरण एक ही मशीन पर चल रहे हैं। आवेदन खुद बहुमत है। कुछ समय के लिए, मैं अपने प्रदर्शन में अजीब देरी देख रहा हूं।स्वतंत्र बहुप्रचारित प्रक्रियाएं एक साथ ब्लॉक करती हैं

कुछ डीबगिंग कोड डालने के बाद, मैं एक अजीब चीज के साथ आया जब डेमॉन के कई उदाहरण सचमुच एक बाहरी कारण या कुछ कारणों से कथित तौर पर अवरुद्ध हो जाते हैं। यह सब सरल रखने के लिए, मैं इस तरह एक दृश्य:

  1. लॉग समय (t1)
  2. ताला म्युटेक्स
  3. कॉल सी ++ std::list::push_back()/pop_back() (यानी बहुत सरल गणित)
  4. अनलॉक म्युटेक्स
  5. लॉग समय (t2)

समय-समय पर, मैं स्पष्ट रूप से देखता हूं कि चरण 3 पर गणित से संबंधित कुछ वास्तव में अत्यधिक समय के लिए कई स्वतंत्र (!) प्रक्रियाओं में चलने वाला अनुक्रम चरण 2 (या चरण 4 पर प्रोबबी) पर ब्लॉक करता है (उदाहरण के लिए, 0.5 - 1.0 सेकंड)। सबूत के रूप में, मुझे लगता है कि सभी प्रक्रियाओं के लिए लॉग में टी 2 सचमुच वही है (कुछ माइक्रोसेकंड में अलग)। ऐसा लगता है कि प्रक्रियाओं के कुछ धागे अपेक्षाकृत अलग-अलग समय पर अनुभाग में प्रवेश करते हैं (मैं स्पष्ट रूप से टी 1 के लिए 0.5 - 1 सेकंड अंतर देख सकता हूं), म्यूटेक्स में लॉक करें, और उस समय अनलॉक करने योग्य समय में अनलॉक करने के दौरान अनलॉक करें लॉग के अनुसार ताला (टी 2 - टी 1 अंतर)। मुझे डरावना लग रहा है।

इस मुद्दे का प्रकटन अपेक्षाकृत दुर्लभ है, लगभग 5-10 मिनट मध्यम भार के तहत। परीक्षण में कोई एनटीपी समय बदलाव लॉग नहीं है (यह वास्तव में मेरा पहला विचार था)। यदि यह एनटीपी था, तो सेवा में वास्तविक देरी नहीं होगी, लॉग में केवल गलत समय होगा।

मैं कहां से शुरू करूं? क्या मैं शेड्यूलर ट्यून करना शुरू करूँ? लिनक्स में सैद्धांतिक रूप से एक संपूर्ण बहुप्रचारित प्रक्रिया को क्या रोक सकता है?

+0

तो म्यूटेक्स धागे द्वारा साझा किए गए संसाधन की सुरक्षा करता है .. क्या आप जानते हैं कि ब्लॉकिंग व्यवहार को देखते समय कितने धागे मौजूद हैं? यानी यह अजीब नहीं हो सकता है अगर धागे के एक टन उस पल में अपनी बारी के लिए इंतजार कर रहे हैं। साथ ही, क्या संसाधन का उपयोग करने का कोई कारण है कि समय की एक बड़ी विविधता है? – nckturner

+3

जब ऐसा होता है तो आप सिस्टम पर मेमोरी प्रेशर की निगरानी कर सकते हैं। बस एक अनुमान (बहुत बढ़ाया नहीं गया) push_back आवंटन निष्पादित कर सकता है जो वर्चुअल आवंटन को गति दे सकता है और धीमा हो सकता है यदि कुल प्रतिबद्धता शुल्क सिस्टम पर पहले से अधिक हो। – nanda

+0

इस अनुक्रम को क्या कॉल कर रहा है? यह कितनी बार चलता है? – ethrbunny

उत्तर

1

के साथ अपने कार्यक्रम चलाने:

valgrind --tool=helgrind ./your_program 

आप अधिक मुद्दों है कि आप उम्मीद कर सकते हैं।

वालग्रिंड (हेल्ग्रिंड) आपको अपने थ्रेडेड एप्लिकेशन का एक विस्तृत परिदृश्य देगा, आजकल तैनाती से पहले अवश्य ही।

+0

धन्यवाद, एडस्पीपर! Valgrind मेरा पवित्र Grail है! हालांकि, यह उत्पादन डीबगिंग के लिए उपयुक्त नहीं है। – neoxic