जब मैं अतिथि के रूप में जेनेटू के साथ अपनी वर्चुअल मशीन चलाता हूं, तो मुझे पता चला है कि 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
के साथ भी संभव है।
मैं सही दृष्टिकोण के बारे में बेहद उलझन में हूं।
मैं चाहता हूं कि जितना संभव हो सके टाइमर इंटरप्ट को नीचे लाएं।
क्या मुझे यह करने का सही तरीका पता है?
यदि मैं 'बिल्ली/proc/interrupts' 2 बार करता हूं, तो मुझे पहले और दूसरे आमंत्रण के बीच 'स्थानीय टाइमर इंटरप्ट्स' बढ़ रहा है। लेकिन 'आईओ-एपीआईसी-एज टाइमर' लेबल वाला एक व्यक्ति 2 आमंत्रणों के बीच समान रहता है। तो वैश्विक टाइमर चर 'jiffies' को बढ़ाने के लिए जिम्मेदार प्रत्येक सीपीयू पर' लोकल टाइमर इंटरप्ट्स 'चल रहा है जो मूल रूप से बूट समय के बाद से टिकों की संख्या रिकॉर्ड करता है ?? इसके अलावा 'आईआरक्यू 0' 'बिल्ली/proc/interrupts' की पहली पंक्ति में टाइमर बाधा से मेल खाता है ... तो मुझे लगता है कि मेरे पास एक 'टिकर सिस्टम' है जिस तरह से बहुत स्पष्ट स्पष्टीकरण ... धन्यवाद – Deepthought
चिंता न करें आई/ओ एपीआईसी, स्थानीय टाइमर इंटरप्ट वास्तव में स्थानीय एपीआईसी से आते हैं, जो एक पूरी तरह से अलग बात है। आईआरक्यू 0 के रूप में आप जो देखते हैं वह I/O एपीआईसी टाइमर होता है, जो शायद अप्रयुक्त होता है (बूट के दौरान शायद)। आप यह कहकर सही कह रहे हैं कि स्थानीय टाइमर वृद्धि जेफियों को बाधित करता है। – jleahy
अरे, मैंने पेशेवर लिनक्स कर्नेल आर्किटेक्चर नामक इस पुस्तक से अब तक टाइमर पढ़ा है और लिनक्स कर्नेल को समझने से थोड़ा सा है, लेकिन मैं स्पष्ट रूप से अभी तक प्रक्रिया को समझ नहीं पा रहा हूं ... मुझे उस कोड को आजमाने और संशोधित करना है जो प्रभावशाली तरीके से jiffies को अद्यतन करता है ... क्या आप एक अच्छे स्रोत की सिफारिश कर सकते हैं जहां मैं न सिर्फ सिद्धांत को समझ सकता हूं बल्कि कर्नेल में कोड जो नौकरी करता है .... धन्यवाद – Deepthought