2012-12-26 11 views
6

ओएस आरएचईएल 6 (2.6.32) है। मैंने कोर को अलग कर दिया है और इस पर एक गहन गहन धागा चला रहा हूं।/proc/{thread-id}/स्थिति प्रत्येक सेकेंड में एक गैर-स्वैच्छिक संदर्भ स्विच दिखाती है।प्रति सेकेंड एक गैर-स्वैच्छिक संदर्भ स्विच क्यों?

प्रश्न में धागा एक SCHED_NORMAL धागा है और मैं इसे बदलना नहीं चाहता हूं।

मैं इस गैर-स्वैच्छिक संदर्भ स्विच को कैसे कम कर सकता हूं? क्या यह/proc/sys/कर्नेल में किसी शेड्यूलिंग पैरामीटर पर निर्भर करता है?

संपादित करें: कई प्रतिक्रिया वैकल्पिक दृष्टिकोण सुझाती हैं। उस मार्ग पर जाने से पहले, मैं पहले समझना चाहता हूं कि मुझे दौड़ के घंटों से भी अधिक प्रति सेकंड एक-स्वैच्छिक संदर्भ स्विच क्यों मिल रहा है। उदाहरण के लिए, क्या यह सीएफएस के कारण होता है? यदि हां, तो कौन से पैरामीटर और कैसे?

EDIT2: आगे स्पष्टीकरण - पहला सवाल मैं है का जवाब चाहते हैं निम्नलिखित: क्यों मैं की, कहते हैं, एक स्विच हर आधे या दो सेकंड के बजाय प्रति सेकंड एक गैर स्वैच्छिक संदर्भ स्विच मिल रहा है?

+1

आप परवाह क्यों करेंगे? प्रति सेकंड 100 संदर्भ स्विच भी आधुनिक प्रणाली पर शोर है। –

+1

इसका वित्तीय ऐप जहां विलंबता प्रीमियम पर है और पूर्व संदर्भ स्विच एक (या अधिक) खो गया अवसर हो सकता है। मैं समझना चाहता हूं कि कौन से सिस्टम ट्यूनिंग पैरामीटर पृथक कोर पर गणना गहन धागे की गैर-स्वैच्छिक संदर्भ स्विच दर निर्धारित करते हैं। –

+0

यह लॉक, सामान्य डिस्क I/O, या पेज गलती पर अवरुद्ध होने की संभावना है। –

उत्तर

12

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

कार्य कतार कोड काम कतार कर्नेल थ्रेड को निर्धारित करने के लिए पर्याप्त स्मार्ट नहीं है यदि कोर 100% निष्क्रिय है लेकिन यह एक कार्य नहीं चला रहा है।

आप इसे ftrace का उपयोग करके सत्यापित कर सकते हैं।यदि शेड_विच ट्रेसर दिखाता है कि जिस इकाई को आप हर सेकेंड में एक बार स्विच करते हैं (मान निकटतम जिफी घटनाओं के लिए गोल होता है और सीपीयू निष्क्रिय होने पर टाइमर गिनती नहीं है तो यह समय को कम कर सकता है) घटनाएं/CPU_NUMBER कार्य (या पुराने कर्नेल के लिए keventd), तो यह लगभग 100% है कि कारण वास्तव में vmstat_update फ़ंक्शन अपने टाइमर को प्रत्येक कार्य कतार आइटम को कतार में सेट करने के लिए सेट करता है जो ईवेंट कर्नेल थ्रेड चलता है।

ध्यान दें कि जिस चक्र पर vmstat अपना टाइमर सेट करता है वह कॉन्फ़िगर करने योग्य है - आप इसे vm.stat_interval sysctl घुंडी के माध्यम से अन्य मान पर सेट कर सकते हैं। इस मूल्य को बढ़ाने से आपको कम सटीक स्मृति उपयोग आंकड़ों की लागत पर इस तरह के बाधाओं की कम दर मिल जाएगी।

मैं अलग-अलग CPU कार्य भार here पर बाधाओं के सभी स्रोतों के साथ विकी बनाए रखता हूं। मेरे पास वर्क कतार आइटम को शेड्यूल करने के लिए vmstat प्राप्त करने के लिए कामों में एक पैच भी है, यदि कोई vmstat कार्य कतार के बीच कोई परिवर्तन नहीं होता है - जैसे कि सीपीयू पर आपका एकल कार्य किसी भी गतिशील स्मृति का उपयोग नहीं करता है आवंटन। सुनिश्चित नहीं है कि इससे आपको लाभ होगा, हालांकि - यह आपके काम के भार पर निर्भर करता है।

0

मैं दृढ़ता से सुझाव देता हूं कि आप कोड को अनुकूलित करने का प्रयास करें ताकि जब यह एक CPU पर चल रहा हो, तो आप इसे अधिकतम प्राप्त कर लेंगे।
किसी भी तरह , मैं इस काम करेंगे, लेकिन यह एक वैसे भी कोशिश देने के लिए और हमें बताएं यकीन नहीं है:

क्या मैं मूल रूप से बस शेड्यूलिंग नीति होने के लिए फीफो तो इस प्रक्रिया को दे सेट कर दिया जाता हूँ अधिकतम प्राथमिकता संभव है।

#include<sched.h> 
struct sched_param sp = sched_get_priority_max(SCHED_FIFO); 
int ret; 

ret = sched_setscheduler(0, SCHED_FIFO, &sp); 
if (ret == -1) { 
    perror("sched_setscheduler"); 
    return 1; 
} 

कृपया ध्यान रखें कि किसी भी अवरुद्ध बयान अपनी प्रक्रिया बनाता है सबसे अधिक संभावना अनुसूचक कारण वाला यह सीपीयू उतरना है।

Source
Man page
संपादित करें:
क्षमा करें, सिर्फ pthread टैग देखा; अवधारणा अभी भी रखती है इसलिए इस मैन पेज को देखें: http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_setschedparam.3.html

+0

क्या आप मुझे बता सकते हैं कि मैं ठीक से एक गैर स्वैच्छिक संदर्भ को कोड में एक सेकंड स्विच क्यों कर रहा हूं जिसमें कोई अवरोधन कथन नहीं है? –

+0

मुझे यकीन नहीं है, लेकिन हो सकता है कि शेड्यूलर आरआर एल्गोरिदम का उपयोग कर रहा हो और आपकी प्रक्रिया का समय टुकड़ा खत्म हो गया है, इसलिए आप फिर से सीपीयू पर प्रेषित हो जाते हैं। – Fingolfin

0

यदि आपके समर्पित CPU पर प्रति सेकंड एक इंटरप्ट होता है तो भी आपको सामान्य शेड्यूलर से गुज़रना पड़ता है। क्या मैं वास्तविक समय और आइसोक्रोनस प्राथमिकता स्तर का सुझाव दे सकता हूं, जो आपकी प्रक्रिया को सामान्य पूर्व-उत्सुक तंत्र से अधिक विश्वसनीय रूप से निर्धारित कर सकता है?

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