intel_idle에서 일부 인텔 제품군 6 CPU 모델 (Core 2, Pentium M)을 지원하지 않는 이유는 무엇입니까?


25

Intel Core 2 Quad (Yorkfield) 프로세서에 맞게 Linux 커널을 조정 하고 있는데 다음 메시지가 나타났습니다 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

PowerTop은 패키지 및 개별 코어에 사용되는 상태 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 드라이버에는 일부 인텔 제품군 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 의 이전 포크 (2010 년 11 월 22 일)는 코어 2 프로세서에 대한 예상 지원을 보여줍니다 (모델 23은 실제로 코어 2 듀오와 쿼드를 모두 포함 함).

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

위의 코드는 2010 년 12 월 commit 에서 삭제되었습니다 .

불행히도 소스 코드에는 문서가 거의 없으므로 이러한 CPU의 유휴 기능 지원 부족에 대한 설명은 없습니다.

현재 커널 구성은 다음과 같습니다.

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

내 질문은 다음과 같습니다.

  • Core 2 프로세서가 지원하지 않는 특정 하드웨어 이유가 intel_idle있습니까?
  • 이 프로세서 제품군에 대한 최적의 CPU 유휴 지원을 위해 커널을 구성하는 더 적절한 방법이 intel_idle있습니까 (에 대한 지원 비활성화 )?

답변:


27

코어 2 CPU 전원 상태 ( " C- 상태 ")를 조사하는 동안 실제로 대부분의 레거시 인텔 코어 / 코어 2 프로세서에 대한 지원을 구현할 수있었습니다. 모든 배경 정보가 포함 된 완전한 구현 (Linux 패치)이 여기에 문서화되어 있습니다.

이 프로세서에 대한 자세한 정보를 축적함에 따라 Core 2 모델에서 지원되는 C 상태가 이전 및 이후 프로세서의 C 상태보다 훨씬 더 복잡하다는 것이 분명해졌습니다. 이를 패키지, 개별 코어 및 칩셋의 다른 구성 요소 (예 : 메모리)와 관련된 Enhanced C- 상태 (또는 " CxE ")라고합니다. intel_idle드라이버가 출시 될 당시 코드는 특별히 성숙하지 않았으며 C- 상태 지원과 충돌하는 여러 Core 2 프로세서가 출시되었습니다.

Core 2 Solo / Duo C-state 지원에 관한 강력한 정보는 이 기사에서 2006 년부터 발견되었습니다 . 이것은 Windows 지원과 관련이 있지만 이러한 프로세서에서 강력한 하드웨어 C 상태 지원을 나타냅니다. Kentsfield에 관한 정보는 실제 모델 번호와 충돌하므로 아래의 Yorkfield를 실제로 참조한다고 생각합니다.

... 쿼드 코어 Intel Core 2 Extreme (Kentsfield) 프로세서는 5 개의 성능 및 절전 기술인 EIST (Enhanced Intel SpeedStep), Thermal Monitor 1 (TM1) 및 Thermal Monitor 2 (TM2), 구형 On-Demand Clock을 모두 지원합니다. 변조 (ODCM) 및 향상된 C 상태 (CxE) C1 (향상된 정지) 상태 만 특징으로하는 Intel Pentium 4 및 Pentium D 600, 800 및 900 프로세서와 비교하여이 기능은 Intel Core 2 프로세서 (Intel Core Solo / Duo 프로세서)에서 확장되었습니다. Grant Grant (C2), Deep Sleep (C3) 및 Deeper Sleep (C4)을 포함하여 프로세서의 모든 유휴 상태.

2008 년이 기사는 Core 2 Duo 및 Core 2 Quad를 포함한 멀티 코어 Intel 프로세서의 코어 별 C 상태에 대한 지원을 간략하게 설명합니다 ( Dell의이 백서에서 추가로 유용한 배경 정보를 찾았습니다 ).

핵심 C- 상태는 하드웨어 C- 상태입니다. CC1 및 CC3과 같은 몇 가지 핵심 유휴 상태가 있습니다. 아시다시피, 최신 프로세서는 일부 서클에서 Penryn으로 알려진 최근 출시 된 Core Duo T5000 / T7000 모바일 프로세서와 같은 다중 코어를 가지고 있습니다. 우리가 CPU / 프로세서라고 생각했던 것은 실제로 여러 범용 CPU가 있습니다. 인텔 코어 듀오에는 프로세서 칩에 2 개의 코어가 있습니다. 인텔 코어 -2 쿼드에는 프로세서 칩당 4 개의 코어가 있습니다. 이러한 각 코어에는 자체 유휴 상태가 있습니다. 하나의 코어가 유휴 상태이고 다른 코어는 스레드에서 작업하기가 어려우므로 의미가 있습니다. 따라서 코어 C 상태는 이러한 코어 중 하나의 유휴 상태입니다.

드라이버 에 대한 추가 배경을 제공하는 인텔2010 프레젠테이션을 발견 intel_idle했지만 불행히도 코어 2에 대한 지원 부족을 설명하지는 않습니다.

이 EXPERIMENTAL 드라이버는 Intel Atom 프로세서, Intel Core i3 / i5 / i7 프로세서 및 관련 Intel Xeon 프로세서에서 acpi_idle을 대체합니다. 인텔 코어 2 프로세서 또는 이전 버전은 지원하지 않습니다.

위의 프레젠테이션은 intel_idle드라이버가 "메뉴"CPU 조정기의 구현이며 Linux 커널 구성에 영향을 미친다 는 것을 나타냅니다 (예 : CONFIG_CPU_IDLE_GOV_LADDERvs. CONFIG_CPU_IDLE_GOV_MENU). 래더와 메뉴 관리자의 차이점은 이 답변 에서 간결하게 설명되어 있습니다.

Dell은 C- 상태 C0-C6 호환성을 나열 하는 유용한 기사 를 제공합니다.

C1 ~ C3 모드는 기본적으로 CPU 내부에서 사용되는 클럭 신호를 차단하여 작동하는 반면 C4 ~ C6 모드는 CPU 전압을 낮추면 작동합니다. "향상된"모드는 동시에 두 가지를 모두 수행 할 수 있습니다.

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

이 표 (나중에 어떤 경우에는 틀린 것으로 판명 됨)에서 Core 2 프로세서에 대한 C- 상태 지원에는 다양한 차이점이있는 것으로 보입니다 (Core를 제외한 거의 모든 Core 2 프로세서는 소켓 LGA775 임에 유의하십시오) 2 소켓 BGA956 및 Merom / Penryn 프로세서 인 Solo SU3500 ( "Intel Core"Solo / Duo 프로세서는 소켓 PBGA479 또는 PPGA478 중 하나).

이 기사 에서 테이블에 대한 추가 예외가 발견되었습니다 .

인텔의 코어 2 듀오 E8500은 C 상태 C2 및 C4를 지원하지만 코어 2 익스트림 QX9650은 지원하지 않습니다.

흥미롭게도 QX9650은 Yorkfield 프로세서 (Intel 제품군 6, 모델 23, 스테핑 6)입니다. 참고로, Q9550S는 Intel 제품군 6, 모델 23 (0x17), 스테핑 10으로, C- 상태 C4 (실험을 통해 확인 됨)를 지원합니다. 또한 Core 2 Solo U3500은 Q9550S와 동일한 CPUID (패밀리, 모델, 스테핑)를 갖지만 LGA775가 아닌 소켓에서 사용할 수 있으며 위 표의 해석을 혼란스럽게합니다.

분명히이 프로세서 모델에 대한 C- 상태 지원을 식별하고 불충분 한 (이 시점에서 결정되지 않은) 경우 CPUID를 최소한 스테핑까지 사용해야합니다.

CPU 유휴 정보를 할당하기위한 메소드 서명은 다음과 같습니다.

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

어디 model에서 열거 ASM / 인텔-family.h . 이 헤더 파일을 살펴보면 인텔 CPU에 인텔 제품군 6 모델 번호와 일치하는 것으로 보이는 8 비트 식별자가 할당되어 있습니다.

#define INTEL_FAM6_CORE2_PENRYN 0x17

위에서 Intel Family 6, Model 23 (0x17)을로 정의했습니다 INTEL_FAM6_CORE2_PENRYN. 이는 대부분의 모델 23 프로세서에 대해 유휴 상태를 정의하기에 충분하지만 위에서 언급 한대로 QX9650에 문제를 일으킬 수 있습니다.

따라서 최소한 C- 상태가 다른 각 프로세서 그룹을이 목록에서 정의해야합니다.

2008 년 Intel Technology Journal 12 (3) : 219-227, Zagacki 및 Ponnala 는 Yorkfield 프로세서가 실제로 C2 및 C4를 지원함을 나타냅니다. 또한 ACPI 3.0a 사양이 C- 상태 C0, C1, C2 및 C3 사이의 전환 만 지원하는 것으로 보이며, Linux acpi_idle드라이버가 제한된 C- 상태 세트 간의 전환으로 제한 될 수도 있습니다 . 그러나이 기사에서는 항상 그런 것은 아닙니다.

프로세서 상태가 아니라 ACPI C 상태이므로 ACPI C3은 HW C6 등일 수 있습니다.

참고 사항 :

프로세서 자체 이외에도 C4는 플랫폼의 주요 실리콘 구성 요소 간 동기화 된 노력이므로 인텔 Q45 익스프레스 칩셋은 28 %의 전력 향상을 달성합니다.

내가 사용하는 칩셋은 실제로 인텔 Q45 익스프레스 칩셋입니다.

MWAIT 상태에 대한 인텔 설명서 는 간결하지만 BIOS 관련 ACPI 동작을 확인합니다.

MWAIT 확장에 정의 된 프로세서 별 C 상태는 ACPI 정의 C 상태 유형 (C0, C1, C2, C3)에 매핑 될 수 있습니다. 매핑 관계는 프로세서 구현에 의한 C 상태 정의에 따라 달라지며 ACPI 정의 _CST 테이블을 사용하여 BIOS에 의해 OSPM에 노출됩니다.

위 표에 대한 나의 해석은 Wikipedia , asm / intel-family.h 및 위 기사 의 표 와 결합되어 있습니다 .

모델 9 0x09 ( 펜티엄 M셀러론 M ) :

  • 바니 아스 : C0, C1, C2, C3, C4

모델 13 0x0D ( 펜티엄 M셀러론 M ) :

  • Dothan, Stealey : C0, C1, C2, C3, C4

모델 14 0x0E INTEL_FAM6_CORE_YONAH ( 향상된 펜티엄 M , 강화 된 셀러론 M 또는 인텔 코어 ) :

  • 요나 ( 코어 솔로 , 코어 듀오 ) : C0, C1, C2, C3, C4, C4E / C5

모델 15 0x0F INTEL_FAM6_CORE2_MEROM (일부 코어 2펜티엄 듀얼 코어 ) :

  • Kentsfield, Merom, Conroe, Allendale ( E2xxx / E4xxxCore 2 Duo E6xxx, T7xxxx / T8xxxx , Core 2 Extreme QX6xxx , Core 2 Quad Q6xxx ) : C0, C1, C1E, C2, C2E

모델 23 0x17 INTEL_FAM6_CORE2_PENRYN ( 코어 2 ) :

  • Merom-L / 펜린 -L :?
  • Penryn ( Core 2 Duo 45nm 모바일 ) : C0, C1, C1E, C2, C2E, C3, C4, C4E / C5, C6
  • Yorkfield ( Core 2 Extreme QX9650 ) : C0, C1, C1E, C2E ?, C3
  • Wolfdale / Yorkfield ( 코어 2 쿼드 , C2Q 제온 , 코어 2 듀오 E5xxx / E7xxx / E8xxx , 펜티엄 듀얼 코어 E6xxx , 셀러론 듀얼 코어 ) : C0, C1, C1E, C2, C2E, C3, C4

코어 2 프로세서 라인 내에서 C- 상태 지원의 다양성의 양에서, C- 상태에 대한 일관된 지원의 부족은 intel_idle드라이버 를 통해 완전히 지원하지 않는 이유 일 수 있습니다 . 전체 코어 2 라인에 대해 위의 목록을 완전히 작성하고 싶습니다.

이 프로세서 에서 강력한 절전 MWAIT C 상태 를 완전히 활용하지 않아 불필요한 전력이 얼마나 사용되고 과도한 열이 발생했는지 (그리고 여전히) 궁금해하기 때문에 실제로 만족스러운 답변은 아닙니다 .

Chattopadhyay et al. 2018 년, 에너지 효율적인 고성능 프로세서 : 친환경 고성능 컴퓨팅 설계를위한 최근의 접근 방식 은 Q45 Express 칩셋에서 찾고있는 특정 동작에 주목할 가치가 있습니다.

패키지 C 상태 (PC0-PC10)-컴퓨팅 도메인, 코어 및 그래픽 (GPU)이 유휴 상태 인 경우 프로세서는 언 코어 및 플랫폼 레벨에서 추가 전력 절약 기회를 갖게됩니다 (예 : LLC 플러시 및 전원 게이팅). 메모리 컨트롤러 및 DRAM IO, 일부 상태에서는 항상 켜져있는 전원 도메인에서 상태를 유지하면서 전체 프로세서를 끌 수 있습니다.

테스트로 linux / drivers / idle / intel_idle.c line 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.c라인 983 :

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),

내 PXE 노드의 빠른 컴파일 및 재부팅 후 다음이 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

마지막으로 Enhanced Core 2 C 상태에 액세스했으며 전력 소비가 크게 감소한 것으로 보입니다 .8 개 노드의 미터는 평균 5 % 이상 낮아진 것으로 보입니다 (한 노드는 여전히 이전 커널을 실행 함) ,하지만 테스트로 커널을 다시 교체하려고합니다.

C4E 지원에 관한 흥미로운 참고 사항 – My Yorktown Q9550S ​​프로세서는 위에서 입증 된 바와 같이 프로세서 (또는 C4의 다른 하위 상태)를 지원하는 것으로 보입니다! 코어 2 Q9000 프로세서 (섹션 6.2) 의 인텔 데이터 시트에 C- 상태 보통 (C0), HALT (C1 = 0x00), 확장 HALT (C1E = 0x01), 보조금 중지 (C2 = 0x10) 만 언급 되어 있기 때문에 혼동 됩니다. , 확장 정지 허가 (C2E = 0x11), 슬립 / 딥 슬립 (C3 = 0x20) 및 딥 슬립 (C4 = 0x30). 이 추가 0x31 상태는 무엇입니까? 상태 C2를 활성화하면 C4 대신 C4E가 사용됩니다. 상태 C2 (강제 상태 C2E)를 비활성화하면 C4E 대신 C4가 사용됩니다. 이것이 MWAIT 플래그와 관련이 있다고 생각되지만 아직이 동작에 대한 설명서를 찾지 못했습니다.

무엇을 만들어야할지 모르겠습니다 .C1E 상태는 C1 대신 사용되는 것으로 보이며 C2는 C2E 대신 사용되며 C4E는 C4 대신 사용됩니다. 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가 하위 상태인지 확실하지 않습니다. 테스트 결과 C4 / C4E가 올바른 것으로 보입니다. C2 상태를 주석 처리하여 C2E를 사용하도록 강제 할 수 있습니다. 그러나 C4E 대신 C4 상태가 사용됩니다 (여기에 더 많은 작업이 필요할 수 있음). 상태 C2E가없는 모델 15 또는 모델 23 프로세서는 없을 것입니다. 이러한 프로세서는 위 코드를 사용하여 C1 / C1E로 제한되기 때문입니다.

또한 플래그, 대기 시간 및 상주 값은 미세 조정될 수 있지만 Nehalem 유휴 값을 기반으로 교육받은 추측을 취하는 것만으로도 잘 작동하는 것 같습니다. 개선하려면 더 많은 정보가 필요합니다.

나는 이것을 Core 2 Duo E2220 ( Allendale ), Dual Core Pentium E5300 ( Wolfdale ), Core 2 Duo E7400 , Core 2 Duo E8400 ( Wolfdale ), Core 2 Quad Q9550S ( Yorkfield ) 및 Core 2 Extreme QX9650 에서 테스트했습니다. 앞서 언급 한 C2 / C2E 및 C4 / C4E 선호도 외에는 문제가 없습니다.

이 드라이버 수정에 포함되지 않습니다 :

  • 원래 Core Solo / Core Duo ( Yonah , 비 Core 2)는 패밀리 6, 모델 14입니다. 이는 C4E / C5 (Enhanced Deep Sleep) C 상태를 지원하지만 C1E / C2E 상태는 지원하지 않기 때문에 좋습니다. 자체 유휴 정의.

내가 생각할 수있는 유일한 문제는 다음과 같습니다.

  • 코어 2 솔로 SU3300 / SU3500 (Penryn-L)은 제품군 6, 모델 23 이며이 드라이버에 의해 감지됩니다. 그러나 소켓 LGA775가 아니므로 C1E Enhanced Halt C 상태를 지원하지 않을 수 있습니다. Core 2 Solo ULV U2100 / U2200 ( Merom-L )도 마찬가지 입니다. 그러나 intel_idle드라이버는 하위 상태의 하드웨어 지원에 따라 적절한 C1 / C1E를 선택하는 것으로 보입니다.
  • 보도에 따르면 코어 2 익스트림 QX9650 (요크 필드)은 C- 상태 C2 또는 C4를 지원하지 않습니다. eBay에서 중고 Optiplex 780 및 QX9650 Extreme 프로세서를 구입하여이를 확인했습니다. 프로세서는 C 상태 C1 및 C1E를 지원합니다. 이 드라이버 수정으로 CPU는 C1 대신 C1E 상태에서 유휴 상태가되어 전력이 약간 절약됩니다. 나는 C-state C3을 볼 것으로 예상했지만,이 드라이버를 사용할 때는 존재하지 않으므로 더 자세히 살펴볼 필요가 있습니다.

C- 상태 (예 : 딥 파워 다운) 간 전환에 대한 2009 인텔 프레젠테이션에서 슬라이드를 찾을 수있었습니다.

딥 파워 다운 기술 진입 / 종료

결론적으로, intel_idle드라이버 에서 코어 2 지원이 부족한 실질적인 이유는 없었습니다 . "Core 2 Duo"에 대한 원래 스텁 코드는 C 상태 C1 및 C2 만 처리했으며 C acpi_idle상태 C3도 처리 하는 함수 보다 훨씬 덜 효율적 이었습니다. 어디를보아야하는지 알면 쉽게 지원을 구현할 수있었습니다. 유용한 의견과 다른 답변에 감사 드리며 아마존이 듣고 있다면 수표를 보낼 곳을 알 수 있습니다.

이 업데이트는 github커밋 되었습니다 . 곧 LKML에 패치를 이메일로 보내겠습니다.

업데이트 : 나는 또한 소켓 T / LGA775 Allendale ( Conroe ) Core 2 Duo E2220 (패밀리 6, 모델 15) 을 파낼 수 있었으므로 지원도 추가했습니다. 이 모델은 C- 상태 C4에 대한 지원은 없지만 C1 / C1E 및 C2 / C2E는 지원합니다. 이것은 다른 Conroe 기반 칩 ( E4xxx / E6xxx ) 및 가능하면 모든 Kentsfield 및 Merom (non-Merom-L) 프로세서에서도 작동합니다.

업데이트 : 마침내 MWAIT 튜닝 리소스를 찾았습니다. 이 Power vs. Performance 쓰기 및이 Deeper C 상태 및 대기 시간 증가 블로그 게시물에는 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 C- 상태가 얼마나 복잡한지를 잊었다. 미개발 전력 절감 다시, 펌웨어는 여전히 C-상태의 적어도 일부의 혜택을 받고해야 충분한 경우 를 통해 acpi_idle 하고 다양한 성능 총재. powertop시스템에 어떤 상태가 표시됩니까?
Stephen Kitt

1
아주 좋은 정보, 업스트림 Linux 커널에 패치제안하는 것을 고려 했습니까?
Lekensteyn

1
"C1E 상태는 C1 대신에 사용되는 것 같습니다 ..."powertop에 표시된대로 사용되는 상태는 커널에 의해서만 결정되므로 "MWAIT 플래그와 관련이없는 것"이라고 생각합니다. 상태의 순서와 exit_latency 및 target_residency만을 기반으로 선택됩니다. 즉, 테스트 할 때 사용되지 않는 것처럼 보이면 테이블의 휴가 상태에 대해 약간 걱정할 것입니다.이 상태가 실제로 예상대로 작동하지 않고 다른 워크로드 패턴이있는 경우 사용 중이며 예기치 않은 동작이 발생했습니다.
sourcejedi

1
"전환은 C0-C1-C0-C1E-C0입니다."-그 슬라이드에 대한 좋은 설명은 아닙니다. 커널 / powertop관점에서 모든 전환은 C0 또는 C0입니다. C0이 아닌 경우 명령을 실행하지 않으므로 커널은 해당 CPU의 상태 간 전환을 관찰하거나 요청할 수 없습니다 :-). 그리고 당신이 말했듯이, 커널 "메뉴"주지사는 예를 들어 C1에 시간을 들이지 않고 C1E로 바로 뛰어들 수 있습니다.
sourcejedi

1
이것은 여러분의 패치가 종료 대기 시간이 점에서, 상류 - P를 받아 얻을 수있는 좋은 방법 아니다 노트 - "바로 네 할렘 유휴 값을 기준으로 교육 추측을 복용하는 것은 잘 작동 것 같다" 안된다 , 그렇지 않으면 당신이 생각, 과소 평가 될 드라이버 (또는 사용자 공간)에 의해 설정 될 수있는 PM_QOS_CPU_DMA_LATENCY 위반
sourcejedi

6

나는 이것이 기회와 비용의 경우 일 수 있다고 생각한다. intel_idle추가 되면 Core 2 Duo 지원이 계획된 것 같지만 완전히 구현 된 적이 없었습니다. 아마도 인텔 엔지니어가이를 처리 할 때까지는 더 이상 가치가 없었습니다. 이 방정식은 상대적으로 복잡합니다. intel_idle충분한 acpi_idle수의 "개선 된"커널을 볼 수있는 CPU에서 여기에서 지원할 가치가 있는 충분한 이점을 제공해야 합니다.

sourcejedi답변에서 알 수 있듯이 드라이버는 모든 가족 6을 배제하지는 않습니다. intel_idle초기화는 기본적으로 Nehalem에서 Kaby Lake에 이르는 모든 마이크로 아키텍처를 포함하는 CPU 모델 목록 에서 CPU를 확인합니다 . Yorkfield는 그보다 더 오래되었습니다 (그리고 상당히 다릅니다. Nehalem은 이전의 아키텍처와는 매우 다릅니다). 패밀리 6 테스트는 오류 메시지의 인쇄 여부에만 영향을줍니다. 그 결과는 오류 메시지가 AMD CPU가 아닌 Intel CPU에만 표시된다는 것입니다 (Intel 제품군 6에는 Pentium Pro 이후 NetBurst가 아닌 모든 Intel CPU가 포함됨).

구성 질문에 대답하려면을 완전히 비활성화 할 수 intel_idle있지만 경고를 신경 쓰지 않는 한 그대로 두십시오.


pr_debug () 메시지는 디버그 메시지를 활성화하기 위해 매우 구체적인 작업을 수행하는 경우에만 나타나므로 경고를 무시할 필요조차 없습니다
sourcejedi

2
@sourcejedi 나는 OP가 그것을보고 있기 때문에 언급했다.
Stephen Kitt

잡았다. 나는 현명한 커널 구성에 대해 질문을 받았기 때문에 매일 사용하는 경우 모든 디버그 메시지를 활성화하는 옵션을 사용하지 않습니까? 올바른 옵션을 사용하면 필요할 때 동적으로 선택적으로 활성화 할 수 있습니다. kernel.org/doc/html/v4.17/admin-guide/dynamic-debug-howto.html 모든 디버그 메시지를 활성화하면 어쨌든 무시하고있는 많은 메시지가있을 수 있습니다. :)
소스 제디

@sourcejedi 커널 메시지 비활성화에 대한 귀하의 의견의 관련성을 보지 못했습니다. 나는 이것이 intel_idle드라이버에 대한 코어 2 지원을 구체적으로 다루는 질문에 건설적인 것으로 보지 않습니다 .
vallismortis

@vallismortis는 매우 접선입니다. 그것은 Core 2 이상에 사용할 수있는 유효한 구성이 있음을 의미합니다. 이것은 단순히 무시 해야하는 성가신 경고 메시지로 인쇄하지 않으며 지원되는 경우 intel_idle을 사용합니다 ... 그러나 동적으로로드 된 것으로 가정합니다 어쨌든 모듈은 언급 할 가치가 없습니다.
sourcejedi

6

이 프로세서 제품군에 대해 최적의 CPU 유휴 지원을 위해 커널을 구성하는 더 적절한 방법이 있습니까 (intel_idle에 대한 지원 비활성화 제외)

ACPI가 활성화되었으며 acpi_idle이 사용 중인지 확인했습니다. 유용한 커널 설정 옵션을 놓쳤다는 것에 진심으로 의심합니다. 항상 powertop가능한 제안을 확인할 수 있지만 이미 알고있을 것입니다.


이것은 답이 아니지만 형식을 지정하고 싶습니다 :-(.

커널 소스 코드를 보면 현재 intel_idle 드라이버에는 인텔 제품군 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 CPU가 지원하지 않는다는 메시지를 제공합니다 intel_idle. 사실, 현재 i5-5300U CPU는 Family 6이며 사용합니다 intel_idle.

CPU를 제외하는 것은 intel_idle_ids테이블에 일치하는 것이 없다는 것입니다 .

이 커밋이 테이블을 구현하는 것을 알았습니다. 제거하는 코드에는 switch대신 명령문이 있습니다. 이것은 쉽게 볼 수있는 최초의 모델 intel_idle가 구현되었는지 / 성공적으로 테스트 / 0x1A 무엇이든 = 26 수 https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b358a016e5c8739ccf186

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.