कुछ इंटेल परिवार 6 सीपीयू मॉडल (कोर 2, पेंटियम एम) Intel_idle द्वारा समर्थित क्यों नहीं हैं?


25

मैं इंटेल कोर 2 क्वाड (यॉर्कफील्ड) प्रोसेसर के लिए अपने लिनक्स कर्नेल को ट्यून कर रहा हूं , और मैंने निम्नलिखित संदेशों को देखा dmesg:

[    0.019526] cpuidle: using governor menu
[    0.531691] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.550918] intel_idle: does not run on family 6 model 23
[    0.554415] tsc: Marking TSC unstable due to TSC halts in idle

पावरटॉप में केवल C1, C2 और C3 को पैकेज और व्यक्तिगत कोर के लिए उपयोग किया जा रहा है:

          Package   |            CPU 0
POLL        0.0%    | POLL        0.0%    0.1 ms
C1          0.0%    | C1          0.0%    0.0 ms
C2          8.2%    | C2          9.9%    0.4 ms
C3         84.9%    | C3         82.5%    0.9 ms

                    |            CPU 1
                    | POLL        0.1%    1.6 ms
                    | C1          0.0%    1.5 ms
                    | C2          9.6%    0.4 ms
                    | C3         82.7%    1.0 ms

                    |            CPU 2
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          7.2%    0.3 ms
                    | C3         86.5%    1.0 ms

                    |            CPU 3
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          5.9%    0.3 ms
                    | C3         87.7%    1.0 ms

जिज्ञासु, मैंने पूछताछ की sysfsऔर पाया कि विरासत acpi_idleचालक उपयोग में था (मुझे intel_idleड्राइवर को देखने की उम्मीद थी ):

cat /sys/devices/system/cpu/cpuidle/current_driver

acpi_idle

कर्नेल स्रोत कोड को देखते हुए, वर्तमान Intel_idle ड्राइवर में विशेष रूप से एक डीबग संदेश होता है जिसमें कहा जाता है कि कुछ Intel परिवार 6 मॉडल ड्राइवर द्वारा समर्थित नहीं हैं:

if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 == 6)
    pr_debug("does not run on family %d model %d\n", boot_cpu_data.x86, boot_cpu_data.x86_model);

Intel_idle.c का एक पूर्व कांटा (22 नवंबर, 2010) कोर 2 प्रोसेसर के लिए प्रत्याशित समर्थन दिखाता है (मॉडल 23 वास्तव में कोर 2 डुओ और क्वाड दोनों को शामिल करता है):

#ifdef FUTURE_USE
    case 0x17:  /* 23 - Core 2 Duo */
        lapic_timer_reliable_states = (1 << 2) | (1 << 1); /* C2, C1 */
#endif

उपरोक्त कोड दिसंबर 2010 में नष्ट कर दिया गया प्रतिबद्ध

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

मेरा वर्तमान कर्नेल विन्यास इस प्रकार है:

CONFIG_SMP=y
CONFIG_MCORE2=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_ACPI_PROCESSOR_IDLE=y
CONFIG_CPU_IDLE=y
# CONFIG_CPU_IDLE_GOV_LADDER is not set
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
CONFIG_INTEL_IDLE=y

मेरा प्रश्न इस प्रकार है:

  • क्या एक विशिष्ट हार्डवेयर कारण है जो कोर 2 प्रोसेसर द्वारा समर्थित नहीं है intel_idle?
  • प्रोसेसर के इस परिवार के लिए इष्टतम सीपीयू निष्क्रिय समर्थन के लिए कर्नेल को कॉन्फ़िगर करने का एक और अधिक उपयुक्त तरीका है (एक तरफ समर्थन को अक्षम करने से intel_idle)?

जवाबों:


28

कोर 2 सीपीयू पावर स्टेट्स (" सी-स्टेट्स ") पर शोध करते हुए , मैं वास्तव में अधिकांश इंटेलिजेंट इंटेल कोर / पीसी प्रोसेसर के लिए समर्थन को लागू करने में कामयाब रहा। सभी पृष्ठभूमि की जानकारी के साथ पूर्ण कार्यान्वयन (लिनक्स पैच) यहां प्रलेखित है।

जैसा कि मैंने इन प्रोसेसर के बारे में अधिक जानकारी जमा की है, यह स्पष्ट होने लगा कि कोर 2 मॉडल (एस) में समर्थित सी-स्टेट्स पहले और बाद के दोनों प्रोसेसर की तुलना में कहीं अधिक जटिल हैं। इन्हें एन्हांस्ड सी-स्टेट्स (या " CxE ") के रूप में जाना जाता है , जिसमें चिपसेट पर पैकेज, व्यक्तिगत कोर और अन्य घटक शामिल होते हैं (जैसे, मेमोरी)। जिस समय intel_idleड्राइवर को छोड़ा गया था, कोड विशेष रूप से परिपक्व नहीं था और कई कोर 2 प्रोसेसर जारी किए गए थे जिनमें परस्पर विरोधी सी-स्टेट समर्थन था।

कोर 2 सोलो / डुओ सी-राज्य समर्थन पर कुछ सम्मोहक जानकारी 2006 से इस लेख में पाई गई थी । यह विंडोज पर समर्थन के संबंध में है, हालांकि यह इन प्रोसेसर पर मजबूत हार्डवेयर सी-स्टेट समर्थन का संकेत देता है। Kentsfield के बारे में जानकारी वास्तविक मॉडल संख्या के साथ संघर्ष करती है, इसलिए मेरा मानना ​​है कि वे वास्तव में नीचे एक यॉर्कफील्ड का उल्लेख कर रहे हैं:

... क्वाड-कोर इंटेल कोर 2 एक्सट्रीम (Kentsfield) प्रोसेसर सभी पांच प्रदर्शन और बिजली बचत प्रौद्योगिकियों का समर्थन करता है - उन्नत इंटेल स्पीडस्टेप (ईआईएसटी), थर्मल मॉनिटर 1 (टीएम 1) और थर्मल मॉनिटर 2 (टीएम 2), पुरानी ऑन-डिमांड घड़ी मॉड्यूलेशन (ODCM), साथ ही एन्हांस्ड C स्टेट्स (CxE)। इंटेल पेंटियम 4 और पेंटियम डी 600, 800, और 900 प्रोसेसर की तुलना में, जो केवल एन्हांस्ड हॉल्ट (C1) स्टेट की विशेषता है, इस फ़ंक्शन को इंटेल कोर 2 प्रोसेसर (और साथ ही इंटेल कोर सोलो / डुओ प्रोसेसर) में विस्तारित किया गया है। स्टॉप ग्रांट (C2), डीप स्लीप (C3), और डीपर स्लीप (C4) सहित एक प्रोसेसर के सभी संभव निष्क्रिय राज्य।

2008 का यह लेख मल्टी-कोर इंटेल प्रोसेसर पर प्रति-कोर सी-स्टेट्स के लिए समर्थन का समर्थन करता है, जिसमें कोर 2 डुओ और कोर 2 क्वाड शामिल हैं ( डेल से इस श्वेत पत्र में अतिरिक्त सहायक पृष्ठभूमि पठन पाया गया ):

एक कोर सी-स्टेट एक हार्डवेयर सी-स्टेट है। कई मुख्य निष्क्रिय अवस्थाएँ हैं, जैसे CC1 और CC3। जैसा कि हम जानते हैं, आधुनिक प्रोसेसर की एक आधुनिक अवस्था में कई कोर होते हैं, जैसे कि हाल ही में जारी कोर डुओ T5000 / T7000 मोबाइल प्रोसेसर, जिसे कुछ सर्कल में पेन्री के रूप में जाना जाता है। हम सीपीयू / प्रोसेसर के रूप में क्या सोचते थे, वास्तव में इसके पक्ष में कई सामान्य उद्देश्य सीपीयू हैं। इंटेल कोर डुओ में प्रोसेसर चिप में 2 कोर हैं। Intel Core-2 Quad में 4 ऐसे कोर प्रति प्रोसेसर चिप है। इनमें से प्रत्येक कोर की अपनी निष्क्रिय अवस्था है। इसका मतलब यह है कि एक कोर निष्क्रिय हो सकता है जबकि दूसरा एक थ्रेड पर काम करने में कठिन है। तो एक कोर सी-स्टेट उन कोर में से एक का निष्क्रिय राज्य है।

मुझे इंटेल से 2010 की प्रस्तुति मिली जो intel_idleड्राइवर के बारे में कुछ अतिरिक्त पृष्ठभूमि प्रदान करती है , लेकिन दुर्भाग्य से कोर 2 के लिए समर्थन की कमी की व्याख्या नहीं करता है:

यह EXPERIMENTAL ड्राइवर इंटेल एटम प्रोसेसर, इंटेल कोर i3 / i5 / i7 प्रोसेसर और संबंधित इंटेल Xeon प्रोसेसर पर acpi_idle को सुपरकोड करता है। यह Intel Core2 प्रोसेसर या उससे पहले का समर्थन नहीं करता है।

उपरोक्त प्रस्तुति इंगित करती है कि intel_idleड्राइवर "मेनू" सीपीयू गवर्नर का कार्यान्वयन है, जिसका लिनक्स कर्नेल कॉन्फ़िगरेशन (यानी, CONFIG_CPU_IDLE_GOV_LADDERबनाम CONFIG_CPU_IDLE_GOV_MENU) पर प्रभाव पड़ता है । सीढ़ी और मेनू के राज्यपालों के बीच अंतर इस उत्तर में स्पष्ट रूप से वर्णित हैं ।

डेल में एक उपयोगी लेख है जो C-C C से C6 संगतता को सूचीबद्ध करता है:

मूल रूप से सीपीयू के अंदर उपयोग किए जाने वाले घड़ी संकेतों को काटकर मोड्स सी 1 से सी 3 तक काम करते हैं, जबकि सीपीयू वोल्टेज को कम करके सी 4 से सी 6 काम करते हैं। "संवर्धित" मोड एक ही समय में दोनों कर सकते हैं।

Mode   Name                   CPUs
C0     Operating State        All CPUs
C1     Halt                   486DX4 and above
C1E    Enhanced Halt          All socket LGA775 CPUs
C1E    —                      Turion 64, 65-nm Athlon X2 and Phenom CPUs
C2     Stop Grant             486DX4 and above
C2     Stop Clock             Only 486DX4, Pentium, Pentium MMX, K5, K6, K6-2, K6-III
C2E    Extended Stop Grant    Core 2 Duo and above (Intel only)
C3     Sleep                  Pentium II, Athlon and above, but not on Core 2 Duo E4000 and E6000
C3     Deep Sleep             Pentium II and above, but not on Core 2 Duo E4000 and E6000; Turion 64
C3     AltVID                 AMD Turion 64
C4     Deeper Sleep           Pentium M and above, but not on Core 2 Duo E4000 and E6000 series; AMD Turion 64
C4E/C5 Enhanced Deeper Sleep  Core Solo, Core Duo and 45-nm mobile Core 2 Duo only
C6     Deep Power Down        45-nm mobile Core 2 Duo only

इस तालिका से (जो मुझे बाद में कुछ मामलों में गलत लगा), ऐसा प्रतीत होता है कि कोर 2 प्रोसेसर के साथ सी-स्टेट समर्थन में कई प्रकार के अंतर थे (ध्यान दें कि कोर को छोड़कर लगभग सभी कोर 2 प्रोसेसर सॉकेट LGA775 हैं 2 सोलो SU3500, जो सॉकेट BGA956 और मेरोम / पेनी प्रोसेसर है। "Intel Core" सोलो / डुओ प्रोसेसर सॉकेट PBGA479 या PPGA478 में से एक हैं)।

इस आलेख में तालिका के लिए एक अतिरिक्त अपवाद पाया गया था :

इंटेल का कोर 2 डुओ ई 8500 सी-स्टेट्स सी 2 और सी 4 का समर्थन करता है, जबकि कोर 2 एक्सट्रीम क्यूएक्स 9650 नहीं करता है।

दिलचस्प है, QX9650 एक यॉर्कफील्ड प्रोसेसर (इंटेल परिवार 6, मॉडल 23, 6 कदम) है। संदर्भ के लिए, मेरा Q9550S ​​इंटेल परिवार 6, मॉडल 23 (0x17) है, 10 कदम है, जो कथित तौर पर सी-स्टेट सी 4 (प्रयोग के माध्यम से पुष्टि) का समर्थन करता है। इसके अतिरिक्त, कोर 2 सोलो U3500 में Q9550S ​​के लिए एक समान CPUID (परिवार, मॉडल, कदम) है, लेकिन एक गैर-LGA775 सॉकेट में उपलब्ध है, जो उपरोक्त तालिका की व्याख्या को भ्रमित करता है।

स्पष्ट रूप से, प्रोसेसर के इस मॉडल के लिए सी-स्टेट समर्थन की पहचान करने के लिए और कुछ मामलों में अपर्याप्त (इस समय अनिर्धारित) हो सकता है, सीपीयूआईडी का उपयोग कम से कम कदम के लिए किया जाना चाहिए।

CPU निष्क्रिय जानकारी प्रदान करने के लिए विधि हस्ताक्षर है:

#define ICPU(model, cpu) \
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&cpu }

अस्म / बुद्धि-परिवारmodel में कहाँ सम्‍मिलित है । इस हेडर फ़ाइल की जांच करते हुए, मैं देखता हूं कि इंटेल सीपीयू को 8-बिट आइडेंटिफ़ायर असाइन किए गए हैं जो इंटेल परिवार 6 मॉडल नंबर से मेल खाते हैं:

#define INTEL_FAM6_CORE2_PENRYN 0x17

ऊपर से, हमारे पास Intel परिवार 6, मॉडल 23 (0x17) के रूप में परिभाषित किया गया है INTEL_FAM6_CORE2_PENRYN। यह मॉडल 23 प्रोसेसर के अधिकांश के लिए निष्क्रिय राज्यों को परिभाषित करने के लिए पर्याप्त होना चाहिए, लेकिन संभवतः जैसा कि ऊपर उल्लेख किया गया है, QX9650 के साथ समस्या पैदा कर सकता है।

इसलिए, न्यूनतम, प्रोसेसर के प्रत्येक समूह के पास एक अलग सी-राज्य सेट है जिसे इस सूची में परिभाषित किया जाना चाहिए।

ज़ागैकी और पोन्नाला, इंटेल टेक्नोलॉजी जर्नल 12 (3): 219-227, 2008 इंगित करता है कि यॉर्कफील्ड प्रोसेसर वास्तव में सी 2 और सी 4 का समर्थन करते हैं। वे यह भी इंगित करते हैं कि ACPI 3.0a विनिर्देश सी-राज्यों C0, C1, C2 और C3 के बीच संक्रमणों का समर्थन करता है, जो मैं मानता हूँ कि acpi_idleसी-स्टेट्स के सीमित सेट के बीच लिनक्स ड्राइवर को संक्रमणों तक सीमित कर सकता है। हालाँकि, यह आलेख बताता है कि हमेशा ऐसा नहीं हो सकता है:

ध्यान रखें कि एसीपीआई सी राज्य है, प्रोसेसर एक नहीं, इसलिए एसीपीआई सी 3 एचडब्ल्यू सी 6, आदि हो सकता है।

नोट का भी:

प्रोसेसर से परे, चूंकि C4 प्लेटफ़ॉर्म में प्रमुख सिलिकॉन घटकों के बीच एक समन्वित प्रयास है, इंटेल Q45 एक्सप्रेस चिपसेट 28 प्रतिशत बिजली सुधार प्राप्त करता है।

मैं जिस चिपसेट का उपयोग कर रहा हूं वह वास्तव में एक इंटेल Q45 एक्सप्रेस चिपसेट है।

MWAIT राज्यों पर इंटेल प्रलेखन संक्षिप्त लेकिन पुष्टि BIOS विशेष ACPI व्यवहार है:

MWAIT एक्सटेंशन में परिभाषित प्रोसेसर-विशिष्ट सी-राज्य ACPI परिभाषित सी-स्टेट प्रकार (C0, C1, C2, C3) पर मैप कर सकते हैं। मैपिंग संबंध प्रोसेसर कार्यान्वयन द्वारा सी-स्टेट की परिभाषा पर निर्भर करता है और एसीपीआई परिभाषित _CST तालिका का उपयोग करके BIOS द्वारा OSPM के संपर्क में है।

उपरोक्त तालिका की मेरी व्याख्या ( विकिपीडिया , asm / Intel-family.h और उपरोक्त लेखों की तालिका के साथ संयुक्त है ):

मॉडल 9 0x09 ( पेंटियम एम और सेलेरॉन एम ):

  • बनिया: सी 0, सी 1, सी 2, सी 3, सी 4

मॉडल 13 0x0D ( पेंटियम एम और सेलेरॉन एम ):

  • दोथन, स्टीली: C0, C1, C2, C3, C4

मॉडल 14 0x0E INTEL_FAM6_CORE_YONAH ( संवर्धित पेंटियम एम , एन्हांस्ड सेलेरॉन एम या इंटेल कोर ):

  • Yonah ( कोर सोलो , कोर डुओ ): C0, C1, C2, C3, C4, C4E / C5

मॉडल 15 0x0F INTEL_FAM6_CORE2_MEROM (कुछ कोर 2 और पेंटियम डुअल-कोर ):

  • Kentsfield, Merom, Conroe, Allendale ( E2xxx / E4xxx और Core 2 Duo E6xxx, T7xxxx / T8xxxx , Core 2 Extreme QX6xxx , Core 2 Quad-6xxx ): C0, C1E, C2, C2E

मॉडल 23 0x17 INTEL_FAM6_CORE2_PENRYN ( कोर 2 ):

  • मेरोम-एल / ​​पेन्री-एल:?
  • पेन्री ( कोर 2 डुओ 45-एनएम मोबाइल ): C0, C1, C1E, C2, C2E, C3, C4, C4E / C5, C6
  • यॉर्कफील्ड ( कोर 2 एक्सट्रीम QX9650 ): C0, C1, C1E, C2E ?, C3
  • वोल्फडेल / यॉर्कफील्ड ( कोर 2 क्वाड , C2Q Xeon , Core 2 Duo E5xxx / E7xxx / E8xxx , Pentium Dual-Core E6xxx , Celeron Dual-Core ): C0, C1, C1E, C2E, C2E, C3, C4

प्रोसेसर की कोर 2 लाइन के भीतर सी-राज्य समर्थन में विविधता की मात्रा से, ऐसा प्रतीत होता है कि सी-राज्यों के लिए लगातार समर्थन की कमी intel_idleड्राइवर के माध्यम से उन्हें पूरी तरह से समर्थन करने का प्रयास नहीं करने का कारण हो सकता है । मैं पूरी कोर 2 लाइन के लिए उपरोक्त सूची को पूरी तरह से पूरा करना चाहूंगा।

यह वास्तव में एक संतोषजनक जवाब नहीं है, क्योंकि यह मुझे आश्चर्यचकित करता है कि अनावश्यक बिजली का कितना उपयोग किया जाता है और इन प्रोसेसर पर मजबूत बिजली की बचत करने वाले MWAIT C- राज्यों का पूरी तरह से उपयोग नहीं करने के कारण अत्यधिक गर्मी (और अभी भी) उत्पन्न हुई है ।

चट्टोपाध्याय एट अल। 2018, एनर्जी एफिशिएंट हाई परफॉर्मेंस प्रोसेसर्स: ग्रीन हाई परफॉर्मेंस कम्प्यूटिंग डिजाइनिंग के लिए हालिया दृष्टिकोण , उस विशिष्ट व्यवहार के लिए ध्यान देने योग्य है जिसे मैं Q45 एक्सप्रेस चिपसेट में देख रहा हूं:

पैकेज सी-स्टेट (PC0-PC10) - जब कंप्यूट डोमेन, कोर और ग्राफिक्स (GPU) निष्क्रिय होते हैं, तो प्रोसेसर के पास uncore और प्लेटफ़ॉर्म स्तर पर अतिरिक्त बिजली बचत का अवसर होता है, उदाहरण के लिए, LLC को फ्लश करके और पावर-गेटिंग मेमोरी कंट्रोलर और DRAM IO, और कुछ राज्य में, पूरे प्रोसेसर को बंद किया जा सकता है, जबकि इसका राज्य हमेशा ऑन-पावर डोमेन पर संरक्षित होता है।

परीक्षण के रूप में, मैंने लिनक्स / ड्राइवरों / निष्क्रिय / Intel_idle.c लाइन 127 पर निम्नलिखित डाला :

static struct cpuidle_state conroe_cstates[] = {
    {
        .name = "C1",
        .desc = "MWAIT 0x00",
        .flags = MWAIT2flg(0x00),
        .exit_latency = 3,
        .target_residency = 6,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C1E",
        .desc = "MWAIT 0x01",
        .flags = MWAIT2flg(0x01),
        .exit_latency = 10,
        .target_residency = 20,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
//  {
//      .name = "C2",
//      .desc = "MWAIT 0x10",
//      .flags = MWAIT2flg(0x10),
//      .exit_latency = 20,
//      .target_residency = 40,
//      .enter = &intel_idle,
//      .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2E",
        .desc = "MWAIT 0x11",
        .flags = MWAIT2flg(0x11),
        .exit_latency = 40,
        .target_residency = 100,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .enter = NULL }
};

static struct cpuidle_state core2_cstates[] = {
    {
        .name = "C1",
        .desc = "MWAIT 0x00",
        .flags = MWAIT2flg(0x00),
        .exit_latency = 3,
        .target_residency = 6,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C1E",
        .desc = "MWAIT 0x01",
        .flags = MWAIT2flg(0x01),
        .exit_latency = 10,
        .target_residency = 20,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2",
        .desc = "MWAIT 0x10",
        .flags = MWAIT2flg(0x10),
        .exit_latency = 20,
        .target_residency = 40,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2E",
        .desc = "MWAIT 0x11",
        .flags = MWAIT2flg(0x11),
        .exit_latency = 40,
        .target_residency = 100,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C3",
        .desc = "MWAIT 0x20",
        .flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 85,
        .target_residency = 200,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C4",
        .desc = "MWAIT 0x30",
        .flags = MWAIT2flg(0x30) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 100,
        .target_residency = 400,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C4E",
        .desc = "MWAIT 0x31",
        .flags = MWAIT2flg(0x31) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 100,
        .target_residency = 400,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C6",
        .desc = "MWAIT 0x40",
        .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 200,
        .target_residency = 800,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .enter = NULL }
};

intel_idle.c983 लाइन पर :

static const struct idle_cpu idle_cpu_conroe = {
    .state_table = conroe_cstates,
    .disable_promotion_to_c1e = false,
};

static const struct idle_cpu idle_cpu_core2 = {
    .state_table = core2_cstates,
    .disable_promotion_to_c1e = false,
};

पर intel_idle.cलाइन 1073:

ICPU(INTEL_FAM6_CORE2_MEROM,  idle_cpu_conroe),
ICPU(INTEL_FAM6_CORE2_PENRYN, idle_cpu_core2),

मेरे पीएक्सई नोड्स के त्वरित संकलन और रिबूट के बाद, dmesgअब दिखाता है:

[    0.019845] cpuidle: using governor menu
[    0.515785] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.543404] intel_idle: MWAIT substates: 0x22220
[    0.543405] intel_idle: v0.4.1 model 0x17
[    0.543413] tsc: Marking TSC unstable due to TSC halts in idle states deeper than C2
[    0.543680] intel_idle: lapic_timer_reliable_states 0x2

और अब PowerTOP दिखा रहा है:

          Package   |            CPU 0
POLL        2.5%    | POLL        0.0%    0.0 ms
C1E         2.9%    | C1E         5.0%   22.4 ms
C2          0.4%    | C2          0.2%    0.2 ms
C3          2.1%    | C3          1.9%    0.5 ms
C4E        89.9%    | C4E        92.6%   66.5 ms

                    |            CPU 1
                    | POLL       10.0%  400.8 ms
                    | C1E         5.1%    6.4 ms
                    | C2          0.3%    0.1 ms
                    | C3          1.4%    0.6 ms
                    | C4E        76.8%   73.6 ms

                    |            CPU 2
                    | POLL        0.0%    0.2 ms
                    | C1E         1.1%    3.7 ms
                    | C2          0.2%    0.2 ms
                    | C3          3.9%    1.3 ms
                    | C4E        93.1%   26.4 ms

                    |            CPU 3
                    | POLL        0.0%    0.7 ms
                    | C1E         0.3%    0.3 ms
                    | C2          1.1%    0.4 ms
                    | C3          1.1%    0.5 ms
                    | C4E        97.0%   45.2 ms

मैंने आखिरकार एन्हांस्ड कोर 2 सी-राज्यों तक पहुंच प्राप्त की है, और ऐसा लगता है कि बिजली की खपत में एक औसत दर्जे की गिरावट है - 8 नोड्स पर मेरा मीटर कम से कम 5% औसत प्रतीत होता है (एक नोड अभी भी पुरानी कर्नेल चला रहा है) , लेकिन मैं एक परीक्षण के रूप में फिर से गुठली को स्वैप करने की कोशिश करूँगा।

C4E समर्थन के बारे में एक दिलचस्प नोट - मेरा यॉर्कटाउन Q9550S ​​प्रोसेसर ऊपर बताए अनुसार इसका समर्थन करता है (या C4 के कुछ अन्य उप-राज्य)! यह मुझे भ्रमित करता है, क्योंकि कोर 2 Q9000 प्रोसेसर (खंड 6.2) पर इंटेल डेटाशीट केवल सी-स्टेट्स नॉर्मल (C0), HALT (C1 = 0x00), विस्तारित HALT (C1E = 0x01), स्टॉप ग्रांट (C2 = 0x10) का उल्लेख करता है , विस्तारित स्टॉप ग्रांट (C2E = 0x11), स्लीप / डीप स्लीप (C3 = 0x20) और डीपर स्लीप (C4 = 0x30)। यह अतिरिक्त 0x31 स्थिति क्या है? यदि मैं राज्य C2 को सक्षम करता हूं, तो C4 के बजाय C4E का उपयोग किया जाता है। यदि मैं राज्य C2 (बल स्थिति C2E) को अक्षम करता हूं तो C4 के बजाय C4 का उपयोग किया जाता है। मुझे संदेह है कि MWAIT झंडे के साथ ऐसा करने के लिए कुछ हो सकता है, लेकिन मुझे अभी तक इस व्यवहार के लिए प्रलेखन नहीं मिला है।

मुझे निश्चित नहीं है कि इसे क्या बनाना है: C1E राज्य C1 के बदले में उपयोग किया गया प्रतीत होता है, C2 का उपयोग C2E के बदले में किया जाता है और C4 के बदले C4E का उपयोग किया जाता है। मैं अनिश्चित हूँ कि C1 / C1E, C2 / C2E और C4 / C4E को एक साथ इस्तेमाल किया जा सकता है intel_idleया यदि वे निरर्थक हैं। मुझे इंटेल लैब्स पिट्सबर्ग की इस 2010 की प्रस्तुति में एक नोट मिला, जो संकेत करता है कि संक्रमण C0 - C1 - C0 - C1E - C0 और आगे के राज्य हैं:

C1E का उपयोग केवल तब किया जाता है जब सभी कोर C1E में हों

मेरा मानना ​​है कि C1E राज्य को अन्य घटकों (जैसे मेमोरी) में दर्ज किया जाता है, जब केवल सभी कोर C1E राज्य में होते हैं। मैं इसे C2 / C2E और C4 / C4E राज्यों के समकक्ष लागू करने के लिए भी लेता हूं (हालाँकि C4E को "C4E / C5" के रूप में संदर्भित किया जाता है, इसलिए यदि C4E C4 का उप-राज्य है या C5 उप है तो मैं अनिश्चित हूँ। C4E की स्थिति। परीक्षण से संकेत मिलता है कि C4 / C4E सही है)। मैं C2E को C2 स्थिति पर टिप्पणी करने के लिए उपयोग करने के लिए बाध्य कर सकता हूं - हालाँकि, इसका कारण C4E के बजाय C4 स्थिति का उपयोग किया जाता है (अधिक काम यहाँ आवश्यक हो सकता है)। उम्मीद है कि कोई मॉडल 15 या मॉडल 23 प्रोसेसर नहीं हैं जिनमें राज्य C2E की कमी है, क्योंकि उन प्रोसेसर उपरोक्त कोड के साथ C1 / C1E तक सीमित होंगे।

इसके अलावा, झंडे, विलंबता और निवास मूल्य शायद ठीक-ठाक होने के लिए खड़े हो सकते हैं, लेकिन सिर्फ नेहले निष्क्रिय मूल्यों के आधार पर शिक्षित अनुमान लगाने से यह ठीक काम करने लगता है। कोई सुधार करने के लिए अधिक रीडिंग की आवश्यकता होगी।

मैं एक पर इस परीक्षण किया कोर 2 डुओ E2220 ( Allendale ), एक डुअल कोर पेंटियम E5300 ( Wolfdale ), कोर 2 डुओ E7400 , कोर 2 डुओ E8400 ( Wolfdale ), कोर 2 Quad Q9550S ( Yorkfield ) और कोर 2 एक्सट्रीम QX9650 , और मैं राज्य C2 / C2E और C4 / C4E के लिए उपर्युक्त वरीयता से परे कोई समस्या नहीं मिली है।

इस चालक संशोधन द्वारा कवर नहीं किया गया:

  • मूल कोर सोलो / कोर जोड़ी ( योना , नॉन कोर 2) परिवार 6, मॉडल 14 हैं। यह अच्छा है क्योंकि उन्होंने C4E / C5 (डीप स्लीप स्लीप) C- स्टेट्स का समर्थन किया है, लेकिन C1E / C2E राज्यों ने नहीं और उनकी आवश्यकता होगी खुद की निष्क्रिय परिभाषा।

केवल वे मुद्दे जो मैं सोच सकता हूं:

  • कोर 2 सोलो SU3300 / SU3500 ( पेन्री -एल) परिवार 6, मॉडल 23 हैं और इस चालक द्वारा पता लगाया जाएगा। हालाँकि, वे सॉकेट LGA775 नहीं हैं, इसलिए वे C1E एन्हांस्ड हॉल्ट सी-स्टेट का समर्थन नहीं कर सकते हैं। इसी तरह कोर 2 सोलो ULV U2100 / U2200 ( मेरोम-एल ) के लिए। हालाँकि, intel_idleड्राइवर उप-राज्यों के हार्डवेयर समर्थन के आधार पर उपयुक्त C1 / C1E का चयन करता है।
  • कोर 2 एक्सट्रीम QX9650 (यॉर्कफील्ड) कथित तौर पर सी-स्टेट C2 या C4 का समर्थन नहीं करता है। मैंने eBay पर एक प्रयुक्त Optiplex 780 और QX9650 एक्सट्रीम प्रोसेसर खरीदकर इसकी पुष्टि की है। प्रोसेसर C-C C और C1E को सपोर्ट करता है। इस ड्राइवर संशोधन के साथ, सीपीयू सी 1 के बजाय राज्य सी 1 ई में निष्क्रिय हो जाता है, इसलिए संभवतः कुछ बिजली बचत है। मुझे सी-स्टेट सी 3 देखने की उम्मीद थी, लेकिन यह इस ड्राइवर का उपयोग करते समय मौजूद नहीं है, इसलिए मुझे आगे इस पर ध्यान देने की आवश्यकता हो सकती है।

मैं सी-स्टेट्स (यानी, डीप पावर डाउन) के बीच बदलाव पर 2009 इंटेल प्रस्तुति से एक स्लाइड खोजने में कामयाब रहा:

डीप पावर डाउन टेक्नोलॉजी एंट्री / एग्जिट

निष्कर्ष में, यह पता चला है कि intel_idleचालक में कोर 2 समर्थन की कमी का कोई वास्तविक कारण नहीं था । अब यह स्पष्ट है कि "कोर 2 डुओ" के लिए मूल स्टब कोड केवल सी-स्टेट्स सी 1 और सी 2 को संभाला है, जो उस acpi_idleफ़ंक्शन की तुलना में बहुत कम कुशल होगा जो सी-स्टेट सी 3 को भी संभालता है। एक बार जब मुझे पता था कि कहां देखना है, तो समर्थन को लागू करना आसान था। सहायक टिप्पणियों और अन्य उत्तरों की बहुत सराहना की गई, और अगर अमेज़ॅन सुन रहा है, तो आप जानते हैं कि चेक कहां भेजना है।

यह अपडेट जीथब के लिए प्रतिबद्ध किया गया है । मैं जल्द ही एलकेएमएल को एक पैच ई-मेल करूंगा।

अपडेट : मैंने सॉकेट टी / एलजीए 775 ऑलेंडेल ( कॉनरो ) कोर 2 डुओ ई 2220 को खोदने में भी कामयाबी हासिल की , जो कि फैमिली 6, मॉडल 15 है, इसलिए मैंने उसके लिए भी समर्थन जोड़ा। इस मॉडल में सी-स्टेट C4 के लिए समर्थन का अभाव है, लेकिन C1 / C1E और C2 / C2E का समर्थन करता है। यह अन्य Conroe- आधारित चिप्स ( E4xxx / E6xxx ) और संभवतः सभी Kentsfield और Merom (गैर Merom-L) प्रोसेसर के लिए भी काम करना चाहिए ।

अपडेट : मुझे आखिरकार कुछ MWAIT ट्यूनिंग संसाधन मिले। यह पॉवर बनाम परफॉर्मेंस राइटअप और इस डीपर सी राज्यों में वृद्धि हुई है और लेटेंसी ब्लॉग पोस्ट दोनों में CPU निष्क्रिय अक्षांशों की पहचान करने पर कुछ उपयोगी जानकारी है। दुर्भाग्य से, यह केवल उन निकास अक्षांशों की रिपोर्ट करता है जिन्हें कर्नेल में कोडित किया गया था (लेकिन, दिलचस्प बात यह है कि प्रोसेसर द्वारा समर्थित केवल उन्हीं हार्डवेयर अवस्थाओं में शामिल हैं:

# cd /sys/devices/system/cpu/cpu0/cpuidle
# for state in `ls -d state*` ; do echo c-$state `cat $state/name` `cat $state/latency` ; done

c-state0/ POLL 0
c-state1/ C1 3
c-state2/ C1E 10
c-state3/ C2 20
c-state4/ C2E 40
c-state5/ C3 20
c-state6/ C4 60
c-state7/ C4E 100

4
यह अच्छा जासूसी का काम है! मैं भूल गया था कि C2D / C2Q सी-स्टेट्स कितने जटिल थे। अप्रयुक्त बिजली बचत, अगर आपका फर्मवेयर काफी अच्छा है, तो आपको अभी भी कम से कम कुछ सी-राज्यों के माध्यम से acpi_idle और विभिन्न प्रदर्शन राज्यपालों का लाभ मिलना चाहिए । powertopआपके सिस्टम पर क्या राज्य दिखाते हैं?
स्टीफन किट

1
बहुत अच्छी जानकारी, क्या आपने अपने पैच को अपस्ट्रीम लिनक्स कर्नेल में प्रस्तावित करने पर विचार किया है ?
लेकेनस्टीन

1
"C1E राज्य C1 के बदले में उपयोग किया जाता है ..." किस राज्य का उपयोग किया जाता है - जैसा कि पावरटॉप द्वारा दिखाया गया है - केवल कर्नेल द्वारा निर्धारित किया जाता है, इसलिए मेरा मानना ​​है कि "MWAIT झंडे के साथ कुछ करना नहीं होगा" यह पूरी तरह से राज्यों के आदेश और बाहर निकलने वाले स्थान और लक्ष्य_समर्थन के आधार पर चुना जाएगा। कहा गया है कि, यदि मैं परीक्षण के दौरान उपयोग में नहीं लाया जाता है, तो मैं तालिका में छुट्टी वाले राज्यों के बारे में थोड़ा चिंतित रहूंगा ... यदि उन राज्यों ने वास्तव में अपेक्षा के अनुरूप काम नहीं किया था, और कुछ अन्य कार्यभार पैटर्न थे जिसके कारण उन्हें इस्तेमाल किया जा रहा है और अप्रत्याशित व्यवहार हो रहा है।
sourcejedi

1
"संक्रमण C0 - C1 - C0 - C1E - C0" हैं - मुझे नहीं लगता कि यह उस स्लाइड का अच्छा विवरण है। कर्नेल / powertopदृष्टिकोण से, सभी संक्रमण या तो C0 या C0 से होते हैं। यदि आप C0 में नहीं हैं, तो आप कोई निर्देश नहीं चला रहे हैं, इसलिए कर्नेल या तो उस सीपीयू पर राज्यों के बीच किसी भी संक्रमण का निरीक्षण या अनुरोध नहीं कर सकता है। और जैसा कि आप कहते हैं, कर्नेल "मेनू" गवर्नर अच्छी तरह से सी 1 ई में सीधे कूद सकता है, सी 1 में किसी भी समय खर्च किए बिना।
sourcejedi

1
"नेहेल बेकार मूल्यों के आधार पर शिक्षित अनुमानों को लेना ठीक लगता है" - ध्यान दें कि यह आपके पैच अपस्ट्रीम को स्वीकार करने का एक अच्छा तरीका नहीं है :-P, इसमें निकास विलंबता को कम नहीं समझना चाहिए, अन्यथा मैं आपको बताऊंगा " PM_QOS_CPU_DMA_LATENCY का उल्लंघन करें, जो ड्राइवरों (या उपयोक्ता?) द्वारा सेट किया जा सकता है
sourcejedi

6

मुझे संदेह है कि यह सिर्फ अवसर और लागत का मामला हो सकता है। जब intel_idleजोड़ा गया था, ऐसा लगता है कि कोर 2 डुओ समर्थन की योजना बनाई गई थी, लेकिन इसे कभी भी पूरी तरह से लागू नहीं किया गया था - शायद जब तक इंटेल इंजीनियरों ने इसे गोल कर दिया, तब तक यह इसके लायक नहीं था। यह समीकरण अपेक्षाकृत जटिल है: सीपीयू पर इसे यहां समर्थन के लायक बनाने के intel_idleलिए पर्याप्त लाभ प्रदान करने की आवश्यकता acpi_idleहै, जो पर्याप्त संख्या में "बेहतर" कर्नेल को देखेगा ...

जैसा कि sourcejedi का जवाब है, ड्राइवर परिवार के सभी को बाहर नहीं करता है 6. सीपीयू मॉडल की एक सूची में सीपीयू केintel_idle लिए प्रारंभिक जांच , मूल रूप से नेहलम से लेकर केबी झील तक सभी माइक्रो-आर्किटेक्चर को कवर करती है। यॉर्कफील्ड उससे भी पुरानी है (और काफी अलग है - नेहेल्म आर्किटेक्चर से बहुत अलग है जो इससे पहले आया था)। परिवार 6 परीक्षण केवल यह प्रभावित करता है कि त्रुटि संदेश मुद्रित है या नहीं; इसका प्रभाव केवल यह है कि त्रुटि संदेश केवल इंटेल सीपीयू पर प्रदर्शित किया जाएगा, न कि एएमडी सीपीयू (इंटेल परिवार 6 में पेंटियम प्रो के बाद से सभी गैर-नेटबर्स्ट इंटेल सीपीयू शामिल हैं)।

आपके कॉन्फ़िगरेशन प्रश्न का उत्तर देने के लिए, आप पूरी तरह से अक्षम कर सकते हैं intel_idle, लेकिन इसे छोड़ना ठीक है (जब तक कि आपको चेतावनी का बुरा न लगे)।


pr_debug () संदेश केवल तभी प्रदर्शित होना चाहिए जब आप उस डिबग संदेश को सक्षम करने के लिए कुछ विशिष्ट करते हैं, इसलिए आपको चेतावनी को अनदेखा करने की भी आवश्यकता नहीं है
sourcejedi

2
@sourcejedi मैंने उल्लेख किया है कि क्योंकि ओपी इसे देख रहा है।
स्टीफन किट

पकड़ लिया। मैं एक आधी-गंभीर टिप्पणी प्रस्तुत करता हूं: चूंकि हमें एक समझदार कर्नेल कॉन्फिग के बारे में पूछा जाता है, यदि इसका उपयोग दिन-प्रतिदिन किया जाता है, तो शायद उस विकल्प का उपयोग न करें जो सभी डिबग संदेशों को सक्षम करता है? सही विकल्प के साथ, उन्हें आवश्यक होने पर गतिशील और चुनिंदा तरीके से सक्षम किया जा सकता है। kernel.org/doc/html/v4.17/admin-guide/dynamic-debug-howto.html यदि आप सभी डिबग संदेशों को सक्षम करते हैं, तो संभवतः आपके पास बहुत सारे संदेश हैं जिन्हें आप वैसे भी अनदेखा कर रहे हैं :)।
sourcejedi

@sourcejedi मैं कर्नेल संदेशों को अक्षम करने के संबंध में आपकी टिप्पणियों की प्रासंगिकता को देखने में विफल हूं। मैं इसे प्रश्न के रचनात्मक रूप में नहीं देखता, जो विशेष रूप से intel_idleड्राइवर के लिए कोर 2 समर्थन को संबोधित करता है ।
vallismortis

@vallismortis यह बहुत ही मूर्त है। इसका मतलब है कि मान्य कॉन्फ़िगरेशन है जिसे आप कोर 2 और इसके बाद के संस्करण के लिए उपयोग कर सकते हैं , जो इसे एक कष्टप्रद चेतावनी संदेश के रूप में प्रिंट नहीं करता है जिसे बस अनदेखा किया जाना चाहिए, और समर्थन होने पर Intel_idle का उपयोग करेगा ... लेकिन फिर मुझे लगता है कि आप गतिशील रूप से लोड किया जाएगा मॉड्यूल वैसे भी, शायद उल्लेख के लायक नहीं है।
sourcejedi

6

प्रोसेसर के इस परिवार के लिए इष्टतम CPU निष्क्रिय समर्थन के लिए कर्नेल को कॉन्फ़िगर करने का एक और अधिक उपयुक्त तरीका है (अलग से Intel_lele के लिए समर्थन अक्षम करने से)

आपके पास ACPI सक्षम है, और आपने जाँच लिया है कि acpi_idle उपयोग में है। मुझे पूरी तरह से संदेह है कि आप किसी भी उपयोगी कर्नेल कॉन्फिगर विकल्प से चूक गए हैं। आप हमेशा powertopसंभावित सुझावों की जांच कर सकते हैं , लेकिन शायद आप पहले से ही जानते थे।


यह एक उत्तर नहीं है, लेकिन मैं इसे प्रारूपित करना चाहता हूं :-(

कर्नेल स्रोत कोड को देखते हुए, वर्तमान Intel_idle ड्राइवर में विशेष रूप से Intel परिवार 6 को ड्राइवर से बाहर करने के लिए एक परीक्षण होता है।

नहीं, यह :-) नहीं है।

id = x86_match_cpu(intel_idle_ids);
if (!id) {
    if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
        boot_cpu_data.x86 == 6)
        pr_debug(PREFIX "does not run on family %d model %d\n",
            boot_cpu_data.x86, boot_cpu_data.x86_model);
    return -ENODEV;
}

यह ifकथन परिवार 6 को बाहर नहीं करता है । इसके बजाय, ifडिबगिंग सक्षम होने पर यह कथन एक संदेश प्रदान करता है, कि यह विशिष्ट आधुनिक इंटेल सीपीयू द्वारा समर्थित नहीं है intel_idle। वास्तव में, मेरा वर्तमान i5-5300U CPU परिवार 6 है और इसका उपयोग करता है intel_idle

आपके सीपीयू को बाहर करने का मतलब यह है कि intel_idle_idsतालिका में कोई मेल नहीं है ।

मैंने इस कमेटी पर गौर किया जिसने टेबल को लागू किया। इसके द्वारा हटाए गए कोड के switchबजाय एक बयान था । इससे यह देखना आसान हो जाता है कि जल्द से जल्द मॉडल Intel_idle को लागू किया गया है / सफलतापूर्वक परीक्षण किया गया है / जो कुछ भी 0x1A = 26 है। https://github.com/torvalds/linux/commit/b66b8b9a4a7a8787dde1b358a016e5c8739ccf186

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.