2012-03-19 10 views
16

में do_timer को प्रभावित करता है एक साधारण प्रयोग में मैंने NOHZ=OFF सेट किया और का उपयोग किया ताकि यह मुद्रित किया जा सके कि do_timer फ़ंक्शन कितनी बार कॉल किया जाता है। यह मेरी मशीन पर हर 10 एमएस कहा जाता है।कैसे NOHZ = ऑन linux कर्नेल

हालांकि NOHZ=ON तो do_timer के रास्ते में बहुत अधिक जिटर कहा जाता है। अधिकांश बार इसे हर 10 एमएस कहा जाता है लेकिन कई बार जब यह समय सीमा पूरी तरह से याद करता है।

मैंने do_timer और NOHZ दोनों के बारे में शोध किया है। do_timerjiffies मान को अपडेट करने के लिए ज़िम्मेदार फ़ंक्शन है और प्रक्रियाओं के राउंड रॉबिन शेड्यूलिंग के लिए भी ज़िम्मेदार है।

NOHZ सुविधा सिस्टम पर हाय-रेज टाइमर को बंद कर देती है।

मुझे क्या समझने में असमर्थ है कि हाई-रेज टाइमर do_timer को कैसे प्रभावित कर सकता है? यहां तक ​​कि यदि हाई-रेज हार्डवेयर नींद में है, तो लगातार घड़ी do_timer को हर 10 एमएस निष्पादित करने में सक्षम होने से अधिक है। दूसरा, यदि do_timer निष्पादित नहीं हो रहा है, तो इसका मतलब है कि कुछ प्रक्रियाओं को अपना टाइमशेयर नहीं मिल रहा है जब उन्हें आदर्श रूप से प्राप्त करना चाहिए। बहुत सारे गुगलिंग से पता चलता है कि कई लोगों के लिए NOHZ=OFF पर कई एप्लिकेशन बहुत बेहतर काम करना शुरू कर देते हैं।

लंबी कहानी कम करने के लिए, NOHZ=ONdo_timer को कैसे प्रभावित करता है?
do_timer इसकी समय सीमा याद क्यों करता है?

उत्तर

30

सबसे पहले समझने की क्या एक tickless kernel (NOHZ=On या CONFIG_NO_HZ सेट) और से 2.6.17

http://www.lesswatts.org/projects/tickless/index.php से लिनक्स कर्नेल में शुरू करने की प्रेरणा क्या था की सुविधा देता है,

परंपरागत रूप से, लिनक्स कर्नेल का इस्तेमाल किया प्रत्येक सीपीयू के लिए एक आवधिक टाइमर। इस टाइमर ने विभिन्न प्रकार की चीजें की, जैसे प्रोसेस एकाउंटिंग, शेड्यूलर लोड बैलेंसिंग, और प्रति-सीपीयू टाइमर ईवेंट बनाए रखना। पुराने लिनक्स कर्नेल ने 100 हर्ट्ज (100 टाइमर इवेंट प्रति सेकेंड या प्रत्येक 10ms में एक ईवेंट) की आवृत्ति के साथ एक टाइमर का उपयोग किया, जबकि नए कर्नेल 250 हर्ट्ज (प्रति सेकेंड 250 घटनाएं या प्रत्येक घटना में एक ईवेंट) या 1000 हर्ट्ज (1000 ईवेंट प्रति दूसरा या एक घटना हर 1 एमएमएस)।

यह आवधिक टाइमर ईवेंट अक्सर "टाइमर टिक" कहा जाता है। टाइमर टिक अपने डिज़ाइन में आसान है, लेकिन इसमें एक महत्वपूर्ण कमी है: टाइमर टिक समय-समय पर होता है, चाहे प्रोसेसर राज्य, चाहे वह निष्क्रिय या व्यस्त हो। यदि प्रोसेसर निष्क्रिय है, तो उसे को अपनी बिजली बचत नींद की स्थिति से हर 1, 4, या 10 मिलीसेकंड उठाना होगा। यह काफी ऊर्जा का खर्च करता है, लैपटॉप में बैटरी जीवन का उपभोग करता है और सर्वरों में अनावश्यक बिजली की खपत का कारण बनता है।

"टिकलेस निष्क्रिय" के साथ, लिनक्स कर्नेल ने सीपीयू निष्क्रिय होने पर इस आवधिक टाइमर टिक को समाप्त कर दिया है। यह सीपीयू को बिजली बचत राज्यों में लंबे समय तक रहने की अनुमति देता है, जिससे कुल सिस्टम पावर खपत कम हो जाती है।

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

इंगो मोलनार के ही शब्दों में

टिकलेस कर्नेल फीचर (CONFIG_NO_HZ) 'ऑन-डिमांड' टाइमर बीच में आता है सक्षम बनाता है: यदि कोई टाइमर कहते हैं 1.5 सेकंड के लिए समाप्त हो गई है जब सिस्टम निष्क्रिय हो जाए , तो सिस्टम 1.5 सेकंड के लिए पूरी तरह से निष्क्रिय रहेगा। यह कूलर सीपीयू और पावर सेविंग लाएगा: हमारे (x86) टेस्टबॉक्स पर हमने प्रभावी आईआरक्यू दर को एचजेड से प्रति सेकंड 1-2 टाइमर इंटरप्ट्स में जाने के लिए मापा है।

अब, की सुविधा देता है अपने क्वेरी- जवाब देने के लिए

क्या मुझे समझ में असमर्थ हूँ कैसे उच्च-रिज़ॉल्यूशन टाइमर do_timer प्रभावित कर सकता है की कोशिश?

यदि कोई सिस्टम हाई-रेज टाइमर का समर्थन करता है, तो अधिकांश सिस्टम पर टाइमर इंटरप्ट सामान्य 10ms से अधिक बार हो सकता है। यानी ये टाइमर सिस्टम क्षमताओं का लाभ उठाकर और टाइमर इंटरप्ट्स को फायर करके सिस्टम को और अधिक उत्तरदायी बनाने की कोशिश करते हैं, हर 100us कहें। NOHZ विकल्प के साथ तो, ये टाइमर ठंडा कर रहे हैं और इसलिए do_timer

के निचले निष्पादन यहां तक ​​कि उच्च-रिज़ॉल्यूशन यदि हार्डवेयर नींद राज्य में है लगातार घड़ी हर 10ms

do_timer निष्पादित करने के लिए सक्षम की तुलना में अधिक है

हां यह सक्षम है। लेकिन NOHZ का इरादा बिल्कुल विपरीत है। लगातार टाइमर इंटरप्ट्स को रोकने के लिए!

दूसरी बात अगर do_timer को क्रियान्वित नहीं किया गया है जब यह इसका मतलब है कि जब वे आदर्श होना चाहिए यह

हो रही caf टिप्पणी में बताया गया है कुछ प्रक्रियाओं उनके टाइमशैयर नहीं मिल रहा है, NOHZ का कारण नहीं है प्रक्रियाओं को कम बार निर्धारित करने के लिए, क्योंकि यह केवल तब होता है जब सीपीयू निष्क्रिय होता है - दूसरे शब्दों में, जब कोई प्रक्रिया शेड्यूल करने योग्य नहीं होती है। केवल देरी समय पर ही प्रक्रिया लेखांकन सामग्री की जाएगी।

do_timer इसकी समय सीमा को याद क्यों करता है?

के रूप में सविस्तार, यह NOHZ

का इरादा डिजाइन मैं सुझाव है कि आप एक प्रारंभिक बिंदु के रूप tick-sched.c कर्नेल के सूत्रों के माध्यम से जाना है।CONFIG_NO_HZ के लिए खोज और NOHZ सुविधा

के लिए जोड़ा नई कार्यक्षमता को समझने के यहाँ एक परीक्षण Impact of a Tickless Kernel

+0

मैं इस उत्तर के लिए आभारी की तुलना में अधिक रहा हूँ को मापने के लिए किया जाता है की कोशिश करो। मैं इस धारणा के तहत था कि NOHZ केवल टाइमर को प्रभावित करता है और इसलिए do_timer किसी भी तरीके से प्रभावित नहीं होता है (मैंने सोचा था कि do_timer को लगातार घड़ी से निकाल दिया गया था जो NOHZ स्विच से प्रभावित नहीं है)। –

+5

'NOHZ' * प्रक्रियाओं को कम से कम निर्धारित नहीं करता है, क्योंकि यह केवल तब होता है जब सीपीयू निष्क्रिय होता है - दूसरे शब्दों में, जब * कोई प्रक्रिया शेड्यूल करने योग्य नहीं होती है *। – caf

+0

@caf पॉइंटर कैफ के लिए बहुत बहुत धन्यवाद। आपकी टिप्पणियों के साथ मेरा उत्तर अपडेट किया गया :) तो, यदि 'NOHZ' प्रक्रिया शेड्यूलिंग को प्रभावित नहीं करता है, तो प्रदर्शन '(जैसे सिस्टम फ्रीज) क्यों होता है जब' NOHZ = OFF'? मैंने देखा है कि इस मंच के बारे में शिकायत करने वाले बहुत से लोग हैं। –