2013-02-17 14 views
14

जब मैं अतिथि के रूप में जेनेटू के साथ अपनी वर्चुअल मशीन चलाता हूं, तो मुझे पता चला है कि tick_periodic फ़ंक्शन से काफी ओवरहेड आ रहा है। (यह वह फ़ंक्शन है जो हर टाइमर इंटरप्ट पर चलता है।) यह फ़ंक्शन write_seqlocks का उपयोग करके वैश्विक jiffy अपडेट करता है जो ओवरहेड की ओर जाता है।लिनक्स कर्नेल टाइमर आवृत्ति को कम करना

यहां HZ का एक grep और मेरी कर्नेल कॉन्फ़िगरेशन फ़ाइल में प्रासंगिक सामग्री है।

[email protected]:~$ cat /boot/config | egrep 'HZ|TIME' 

# CONFIG_RCU_FAST_NO_HZ is not set 
CONFIG_NO_HZ=y 
# CONFIG_HZ_100 is not set 
# CONFIG_HZ_250 is not set 
# CONFIG_HZ_300 is not set 
CONFIG_HZ_1000=y 
CONFIG_HZ=1000 
# CONFIG_MACHZ_WDT is not set 
CONFIG_TIMERFD=y 
CONFIG_HIGH_RES_TIMERS=y 
CONFIG_X86_CYCLONE_TIMER=y 
CONFIG_HPET_TIMER=y 

जाहिर है यह 1000 के विन्यास की स्थापना की है, लेकिन जब मैं sysconf(_SC_CLK_TCK) करते हैं, मैं अपने टाइमर आवृत्ति के रूप में 100 मिलता है। तो मेरे सिस्टम की टाइमर आवृत्ति क्या है?

मैं क्या करना चाहता हूं आवृत्ति को 100 तक कम करना, यदि संभव हो तो भी कम हो। यद्यपि यह poll/select और शेड्यूलर समय टुकड़ा की अंतःक्रियाशीलता और परिशुद्धता को प्रभावित कर सकता है, लेकिन मैं इन चीजों को कम टाइमर बाधा के लिए त्यागने के लिए तैयार हूं क्योंकि यह वीएम को गति देगा।

जब मैंने यह पता लगाने की कोशिश की कि मुझे क्या करना है, तो मैं कॉन्फ़िगरेशन फ़ाइल में बदलकर ऐसा कुछ कर सकता हूं, जहां मैं पढ़ता हूं कि बूट पैरामीटर में divider = 10 जोड़ना नौकरी करता है, अन्यथा जहां मैंने पढ़ा है कि यदि आप CONFIG_HIGH_RES_TIMERS को टाइमर आवृत्ति को बढ़ाए बिना भी कम-विलंबता टाइमर को एसिव करने के लिए सेट कर सकते हैं और यह एक टिकलेस सिस्टम CONFIG_NO_HZ के साथ भी संभव है।

मैं सही दृष्टिकोण के बारे में बेहद उलझन में हूं।

मैं चाहता हूं कि जितना संभव हो सके टाइमर इंटरप्ट को नीचे लाएं।

क्या मुझे यह करने का सही तरीका पता है?

उत्तर

15

चिंता न करें! आपका भ्रम कुछ भी नहीं बल्कि उम्मीद है। लिनक्स टाइमर इंटरप्ट बहुत भ्रमित हैं और उनके पास लंबा और काफी रोमांचक इतिहास रहा है।

CLK_TCK

लिनक्स कोई sysconf सिस्टम कॉल है और glibc सिर्फ निरंतर मूल्य लौटा रहा है 100 क्षमा करें।

हर्ट्ज < - क्या आप शायद

आप या तो 100Hz, 250Hz, 300Hz या 1000Hz की एक टाइमर आवृत्ति चयन कर सकते हैं जब आपके कर्नेल को विन्यस्त चाहते हैं। ये सभी समर्थित हैं, और हालांकि 1000 हर्ट्ज डिफ़ॉल्ट है, यह हमेशा सर्वोत्तम नहीं होता है।

लोग आम तौर पर उच्च मूल्य चुनते हैं जब वे विलंबता (डेस्कटॉप या वेबसर्वर) मानते हैं और जब वे थ्रूपुट (एचपीसी) मानते हैं तो कम मूल्य।

CONFIG_HIGH_RES_TIMERS

यह टाइमर बीच में आता है के साथ कोई संबंध नहीं है, यह सिर्फ एक तंत्र आप उच्च संकल्प टाइमर की अनुमति देता है कि है। इसका मूल रूप से मतलब है कि select जैसे कॉल पर टाइमआउट 1/एचजेड सेकंड से अधिक सटीक हो सकता है।

विभक्त

यह आदेश पंक्ति विकल्प रेड हैट द्वारा प्रदान की एक पैच है। आप शायद इसका उपयोग कर सकते हैं (यदि आप Red Hat या CentOS का उपयोग कर रहे हैं), लेकिन मैं सावधान रहूंगा। यह बहुत सारी बग का कारण बनता है और आपको शायद एक अलग एचजे मान के साथ पुनः संयोजित करना चाहिए।

CONFIG_NO_HZ

यह वास्तव में ज्यादा कुछ नहीं है, यह बिजली की बचत के लिए है और इसका मतलब है कि टिक बंद हो जाएगा (या कम से कम लगातार कम हो जाते हैं) जब कुछ भी क्रियान्वित किया जाता है। यह शायद आपके कर्नेल पर पहले ही सक्षम है। कम से कम एक कार्य चलने योग्य होने पर इससे कोई फर्क नहीं पड़ता है।

फ्रेडरिक वीसबेकर वास्तव में एक पैच लंबित है जो इसे सामान्यीकृत करता है जहां केवल एक ही कार्य चल रहा है, लेकिन यह अभी तक थोड़ा सा रास्ता है।

+1

यदि मैं 'बिल्ली/proc/interrupts' 2 बार करता हूं, तो मुझे पहले और दूसरे आमंत्रण के बीच 'स्थानीय टाइमर इंटरप्ट्स' बढ़ रहा है। लेकिन 'आईओ-एपीआईसी-एज टाइमर' लेबल वाला एक व्यक्ति 2 आमंत्रणों के बीच समान रहता है। तो वैश्विक टाइमर चर 'jiffies' को बढ़ाने के लिए जिम्मेदार प्रत्येक सीपीयू पर' लोकल टाइमर इंटरप्ट्स 'चल रहा है जो मूल रूप से बूट समय के बाद से टिकों की संख्या रिकॉर्ड करता है ?? इसके अलावा 'आईआरक्यू 0' 'बिल्ली/proc/interrupts' की पहली पंक्ति में टाइमर बाधा से मेल खाता है ... तो मुझे लगता है कि मेरे पास एक 'टिकर सिस्टम' है जिस तरह से बहुत स्पष्ट स्पष्टीकरण ... धन्यवाद – Deepthought

+0

चिंता न करें आई/ओ एपीआईसी, स्थानीय टाइमर इंटरप्ट वास्तव में स्थानीय एपीआईसी से आते हैं, जो एक पूरी तरह से अलग बात है। आईआरक्यू 0 के रूप में आप जो देखते हैं वह I/O एपीआईसी टाइमर होता है, जो शायद अप्रयुक्त होता है (बूट के दौरान शायद)। आप यह कहकर सही कह रहे हैं कि स्थानीय टाइमर वृद्धि जेफियों को बाधित करता है। – jleahy

+0

अरे, मैंने पेशेवर लिनक्स कर्नेल आर्किटेक्चर नामक इस पुस्तक से अब तक टाइमर पढ़ा है और लिनक्स कर्नेल को समझने से थोड़ा सा है, लेकिन मैं स्पष्ट रूप से अभी तक प्रक्रिया को समझ नहीं पा रहा हूं ... मुझे उस कोड को आजमाने और संशोधित करना है जो प्रभावशाली तरीके से jiffies को अद्यतन करता है ... क्या आप एक अच्छे स्रोत की सिफारिश कर सकते हैं जहां मैं न सिर्फ सिद्धांत को समझ सकता हूं बल्कि कर्नेल में कोड जो नौकरी करता है .... धन्यवाद – Deepthought

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