intel_idleが一部のIntelシリーズ6 CPUモデル(Core 2、Pentium M)をサポートしていないのはなぜですか?

intel_idleが一部のIntelシリーズ6 CPUモデル(Core 2、Pentium M)をサポートしていないのはなぜですか?

私はLinuxカーネルを調整してきました。Intel Core 2クワッド(Yorkfield)プロセッサで次のメッセージが見つかりました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シリーズ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);

前のフォーク(2010年11月22日)intel_idle.cCore 2プロセッサの期待されるサポートを示しています(モデル23は実際にCore 2 DuoとQuadを含みます)。

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

上記のコードは2010年12月に削除されました。犯罪

残念ながら、ソースコードには文書がほとんどないため、これらの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)。

答え1

Core 2 作業時CPU電源状態(「Cステータス)、実際にはほとんどの古いIntel Core / Core 2プロセッサのサポートを実装しました。完全な実装(Linuxパッチ)とすべての背景情報がここに文書化されています。

これらのプロセッサに関するより多くの情報を蓄積することで、Core 2モデルでサポートされているC状態は、前後のプロセッサのC状態よりもはるかに複雑であることがわかりました。これらは呼び出されます改善されたCステータス(または」CXE))には、チップセットのパッケージ、個々のコア、その他のコンポーネント(メモリなど)が含まれています。ドライバーのリリース時に、intel_idleコードは特に成熟しておらず、複数のCore 2プロセッサがクラッシュするC国家サポート。

Core 2 Solo/Duo C-state サポートに関するいくつかの有用な情報は、以下で確認できます。この記事は2006年の記事です。これは Windows サポートに関連していますが、これらのプロセッサに対する強力なハードウェア C 状態サポートを示しています。 Kentsfieldに関する情報は実際のモデル番号と衝突するので、実際には以下のYorkfieldを参照すると考えられます。

...クアッドコアIntel Core 2 Extreme(Kentsfield)プロセッサは、Enhanced Intel SpeedStep(EIST)、Thermal Monitor 1(TM1)、Thermal Monitor 2(TM2)、Legacy On-Demand Clockなど、5つのパフォーマンスと省電力技術をすべてサポートします。変調(ODCM)およびC状態強化(CxE)。この機能は、Intel Pentium 4およびPentium D 600、800、および900プロセッサと比較して、Intel Core 2プロセッサ(およびIntel Core Solo / Duoプロセッサ)で拡張された一時停止(C1)ステータス機能のみを備えています。 Stop Grant(C2)、Deep Sleep(C3)、Deep Sleep(C4)を含むプロセッサのアイドル状態。

この記事は2008年の記事ですCore 2 Duo および Core 2 Quad を含むマルチコア Intel プロセッサのコア固有の C 状態サポートの概要Dellホワイトペーパー):

コアC状態はハードウェアC状態である。 CC1 や CC3 など、いくつかのコアアイドル状態があります。最近リリースされたCore Duo T5000 / T7000モバイルプロセッサ(一部ではPenrynとも呼ばれます)など、最新の最先端のプロセッサにマルチコアがあることは誰もが知っているという事実です。私たちがCPU/プロセッサだと思ったのは、実際には複数の汎用CPUを含んでいました。 Intel Core Duoプロセッサチップには2つのコアがあります。 Intel Core-2 Quadには、各プロセッサチップに4つのコアがあります。各コアには独自のアイドル状態があります。あるコアはアイドル状態になる可能性があり、もう一方のコアはスレッドで一生懸命働いているため、これは意味があります。したがって、コアC状態は、これらのコアのうちの1つのアイドル状態である。

私が一つ見つけたインテル2010のスピーチドライバに関するいくつかの追加の背景情報を提供しますintel_idleが、残念ながら、Core 2 のサポートの欠如については説明しません。

この実験用ドライバは、Intel Atomプロセッサ、Intel Core i3/i5/i7プロセッサ、および関連するIntel Xeonプロセッサのacpi_idleを置き換えます。 Intel Core2以前のプロセッサはサポートされていません。

上記の紹介は、intel_idleドライバがLinuxカーネルの設定に影響を与える「メニュー」CPUマネージャの実装であることを示しています(例CONFIG_CPU_IDLE_GOV_LADDER:)CONFIG_CPU_IDLE_GOV_MENU。ラダーコントロールとメニューコントロールの違いは次のとおりです。この回答

Dellには1つあります。役に立つ記事リストされたCは、C0からC6までの互換性を示します。

C1〜C3モードは基本的にCPU内部で使用するクロック信号を遮断して動作し、C4〜C6モードはCPU電圧を下げて動作します。 「拡張」モードは、2つの方法を同時に実行できます。

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 2プロセッサプロセッサを除いて、ほとんどすべてのCore 2プロセッサはソケットLGA775です)。 )2 Solo SU3500はソケットBGA956およびMerom / Penrynプロセッサであり、「Intel Core」Solo / DuoプロセッサはソケットPBGA479またはPPGA478のいずれかです。

この表の別の例外は次のとおりです。この記事:

IntelのCore 2 Duo E8500はC-state C2およびC4をサポートしますが、Core 2 Extreme QX9650はサポートしません。

興味深いことに、QX9650はYorkfieldプロセッサ(Intel Series 6、Model 23、Step 6)です。ちなみに、私のQ9550SはIntel family 6、model 23(0x17)、step 10で、C state 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/intel-family.h。このヘッダファイルを調べると、Intel CPUにIntel Series 6モデルと一致するように見える8ビット識別子が割り当てられていることがわかります。

#define INTEL_FAM6_CORE2_PENRYN 0x17

上記では、Intel Family 6、Model 23(0x17)をINTEL_FAM6_CORE2_PENRYN

したがって、少なくとも異なるC状態セットを持つすべてのプロセッサセットをこのリストに定義する必要があります。

ザカキとボナラ、インテル技術マガジン 12(3):219-227, 2008YorkfieldプロセッサがC2とC4をサポートしていることを示しています。また、ACPI 3.0aの仕様は、C状態C0、C1、C2、およびC3間の切り替えのみをサポートしていることを示すようです。これは、Linuxacpi_idleドライバが制限されたC状態セット間でのみ切り替えることを制限する可能性があると思います。しかし、この記事いつもそうではないかもしれないことを示してください。

これはプロセッサ状態ではなくACPI C状態であるため、ACPI C3はHW C6などである可能性があります。

また注目に値するもの:

プロセッサ自体に加えて、Intel Q45 Expressチップセットは、プラットフォームの主要なシリコンコンポーネント間の同期作業であるC4により、消費電力が28%向上しました。

私が使っているチップセットは、実際にはIntel Q45 Expressチップセットです。

これ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):

  • ドーダンスティーリー:C0、C1、C2、C3、C4

モデル14 0x0E INTEL_FAM6_CORE_YONAH(改良されたペンティアムM改良されたセロロンMまたはIntel Core):

  • ヨナ(コアソロコアデュアルコア): C0、C1、C2、C3、C4、C4E/C5

モデル15 0x0F INTEL_FAM6_CORE2_MEROM(一部コア2そしてペンティアムデュアルコア):

  • ケンツフィールド、メロム、コンロ、アランデール(E2xxx/E4xxxそしてCore 2 Duo E6xxx、T7xxxx/T8xxxxCore 2 Extreme QX6xxxコア2クワッドQ6xxx):C0、C1、C1E、C2、C2E

モデル23 0x17 INTEL_FAM6_CORE2_PENRYN(コア2):

  • メロム-L/Penglin-L:?
  • パンリン(Core 2 Duo 45nmモバイルプロセッサ): C0、C1、C1E、C2、C2E、C3、C4、C4E/C5、C6
  • ヨークフィールド(Core 2 Extreme QX9650):C0、C1、C1E、C2E?、C3
  • ウルフデール/ヨークフィールド(コア2クワッドC2Q Xeonコア2デュアルコアE5xxx/E7xxx/E8xxxペンティアムデュアルコアE6xxxCeleron デュアルコア):C0、C1、C1E、C2、C2E、C3、C4

Core 2シリーズプロセッサのC状態サポートの多様性であると判断した場合、C状態の一貫したサポートがないことは、ドライバを介してC状態を完全にサポートしようとしない理由ですintel_idle。全体のCore 2シリーズの上記のリストを完成させたいです。

これは、優れた省電力機能を最大限に活用しないことで、どのくらいの不要な電力が使用されて(そしてまだ発生しているか)疑問になるため、実際に満足のいく答えではありません。MWAIT Cステータスこのプロセッサでは。

チャトパディアイ他。2018年、エネルギー効率の高い高性能プロセッサ:環境に優しい高性能コンピューティング設計への最新のアプローチQ45 Expressチップセットで私が探している特定の動作に注目する価値があります。

パッケージCステータス(PC0-PC10) - コンピューティングドメイン、コア、グラフィックカード(GPU)がアイドル状態の場合、プロセッサはLLCや電力リフレッシュなどの非コアおよびプラットフォームレベルで追加の電力節約を達成する機会を持ちます。です。 - メモリコントローラとDRAM IOをゲートし、特定の状態では、その状態が常にオンになっている電源ドメインに保持されている間、プロセッサ全体がシャットダウンする可能性があります。

テストとして以下を挿入しました。Linux/ドライバ/idle/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 }
};

983行intel_idle.c:

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,
};

ライン1073 intel_idle.c

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%以上減少したようです(ノードの1つはまだ古いコアを実行しています)。しかし、テストでカーネルをもう一度切り替えてみましょう。

C4Eサポートに関する興味深い注意 - 上記のように、Yorkown Q9550Sプロセッサがそれをサポートしているようです(またはC4の他のサブステータス)!これが私を混乱させる。なぜならIntel Core 2 Q9000プロセッサデータシート(セクション6.2)CステータスOK(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、それとも重複しているのかはわかりません。コメントが見つかりました。Intel Pittsburgh Labs 2010のデモンストレーションC0-C1-C0-C1E-C0への変換を示し、以下のように詳細に説明する。

すべてのコアがC1Eにある場合にのみC1Eを使用してください。

これは、すべてのコアがC1E状態にならなければ、他のコンポーネント(メモリなど)がC1E状態に入るという事実として説明できると思います。私はC2 / C2EとC4 / C4Eの状態にも同じことが当てはまると思います。 (C4Eは「C4E / C5」と呼ばれるため、C4EがC4の下位状態であるか、C5がC4Eの下位状態であるかは不明です)。テストの結果、C4 / C4Eが正しいことがわかりました。 C2 状態をコメントアウトして、C2E を強制的に使用することができます。ただし、これによりC4Eの代わりにC4状態が使用されます(ここでより多くの作業が必要になる場合があります)。状態C2Eが欠落しているモデル15またはモデル23プロセッサがないことを願っています。プロセッサは上記のコードを使用してC1 / C1Eに制限されているためです。

また、フラグ、遅延、およびドウェル値の微調整が必​​要な場合がありますが、Nehalemアイドル値に基づいて学習された推測を取るだけでうまくいくようです。改善が行われる前に、より多くの読書が必要です。

私はこれをテストしました。Core 2 Duo E2220アランデール)、ㅏデュアルコアペンティアムE5300ウルフデール)、Core 2 Duo E7400Core 2 Duo E8400ウルフデール)、コア2クワッドQ9550Sヨークフィールド)とCore 2 Extreme QX9650、状態C2 / C2EおよびC4 / C4Eの上記のデフォルト設定以外の問題は表示されません。

このドライバの変更には次のものは含まれません。

  • オリジナルコアソロ/コアデュアルコアユナ、ビコア2)はシリーズ6、モデル14です。これはC4E / C5(拡張ディープスリープ)C状態をサポートしますが、C1E / C2E状態はサポートしておらず、独自のアイドル定義が必要なため、これはお勧めです。

私が考えることができる唯一の質問は次のとおりです。

  • コア2ソロSU3300 /SU3500(Penryn-L)はシリーズ6、モデル23で、このドライバによって検出されます。ただし、LGA775 ソケットではないため、C1E 拡張停止 C 状態をサポートしていない可能性があります。 Core 2 Solo ULV U2100/U2200(メロム-L)。ただし、intel_idleドライバは、サブ状態のハードウェアサポートに基づいて適切なC1 / C1Eを選択しているようです。
  • Core 2 Extreme QX9650(Yorkfield)は、C-state C2またはC4をサポートしていないことが知られています。 eBayから中古Optiplex 780およびQX9650 Extremeプロセッサを購入し、これを確認しました。プロセッサはC状態C1とC1Eをサポートします。このドライバの変更により、CPUはC1ではなくC1E状態でアイドル状態になり、一部の電力を節約できます。 CステータスC3が表示されると予想しましたが、このドライバを使用すると表示されないため、さらに調査する必要があるかもしれません。

私は2009年、IntelプレゼンテーションでC状態間の切り替え(つまり最大電源遮断)に関するスライドを見つけました。

ディープパワーダウン技術への参入/終了

全体として、intel_idleドライバーがCore 2のサポートを欠いている実際の理由はないことがわかりました。 「Core 2 Duo」の元のスタブコードは、C状態C1とC2のみを処理することが明らかになりましたacpi_idle。どこを見なければならないかを知ると、サポートを実装するのは簡単でした。役に立つコメントやその他の回答に心から感謝します。 Amazonが聞いている場合は、小切手をどこに送るかをご存知でしょう。

このアップデートではgithubにコミットされました。まもなくLKMLにパッチをメールでお送りします。

修正する:ソケットT/LGA775も見つかりました。アランデールコンロ) Core 2 Duo E2220、シリーズ 6、モデル 15 の一部なので、サポートも追加しました。このモデルはC-state C4のサポートを欠いていますが、C1 / C1EとC2 / C2Eをサポートしています。これは他のConroeベースのチップにも適用されます(E4xxx/E6xxx)および可能であれば、すべてのKentsfieldおよびMerom(Merom-L以外)プロセッサ。

修正する:ついにMWAITチューニングリソースが見つかりました。これ力と性能書いてこれより深い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

修正する:最近のIntelのスタッフによる投稿記事intel_idleMWAITステータスの詳細な説明。

答え2

私はこれが機会と費用の問題かもしれないと思います。 Core 2 Duoのサポートは、追加されたときに計画されたように見えましたが、完全intel_idleには実現されませんでした。おそらく、Intelエンジニアがこれを考慮し始めたとき、それ以上価値がなかったでしょう。方程式は比較的複雑です。ここでサポートする価値があるためには、intel_idle十分な利点を提供する必要がありacpi_idle、十分な数の「向上した」コアがCPUに表示されます。

〜のようにソースジェダイ~の回答そのドライバはすべてのシリーズ6を除外しません。intel_idle初期化確認CPUCPUモデル一覧、基本的には、NehalemからKaby Lakeまで、すべてのマイクロアーキテクチャをカバーしています。 Yorkfieldはそれよりも古いです(そしてかなり異なります。Nehalemは以前のバージョンとはかなり異なります)。ファミリ 6 テストは、エラーメッセージが印刷されるかどうかにのみ影響します。その効果は、エラーメッセージがAMD CPUではなくIntel CPUにのみ表示されることです(Intelファミリ6には、Pentium Pro以降のNetBurst以外のすべてのIntel CPUが含まれています)。

設定質問に答えるには完全に無効にすることができますがintel_idle、そのままにしても大丈夫です(警告に気を使わない限り)。

答え3

このプロセッサスイートの最適なCPUアイドルサポートのためにカーネルを設定するためのより適切な方法はありますか(intel_idleのサポートを無効にすることを除く)

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 CPUがサポートされていないというメッセージを提供しますintel_idle。実際、現在i5-5300U CPUはファミリー6ですintel_idle

CPUを除外することは、テーブルに一致するものがないことですintel_idle_ids

私はこれがテーブル提出を実装していることがわかりました。削除するコードにはswitchステートメントがあります。これにより、初期モデルintel_idleが実装/成功的にテスト/ 0x1A = 26であることを簡単に確認できます。 https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b358a016e5c8739ccf186

答え4

1年が経つと、これらの古いシステムはますますまれになりますが、まだアイドル状態のカーネルサポートはありません。上記と同様の方法でコアをカスタマイズし、コア温度と消費電力を効果的に下げました。以前はアイドル状態の場合、コア温度は約60℃、 intel_idle をカスタマイズする場合は約45℃でした。

intel_idle.cでは少し異なる設定を使用しています。 C1E 昇格無効フラグを設定しました。 C1Eは、プロセッサがC1に入るたびに通常自動的に到達する状態です(BIOSで設定されている場合)。 intel_idleは、すべての場合にこの機能を無効にし、C1Eを別々のC状態として扱います。これは、主にプロセッサがQoSの問題を引き起こす可能性がある遅延状態に誤って閉じ込められないようにするためです。これは max_cstate が予想より 1 高いことを意味します。 2はC1Eだからです。 )。 C2E の状態も似ていますが、 intel_idle で無効になっているか別々に処理されないため、設定から完全に除外しました。 BIOSには通常、この状態への自動アップグレードを有効または無効にするオプションがあるため、BIOSで無効にしてintel_idleで有効にすると、おそらくより良い結果が得られますが、試していませんでした。

これはE2180で行われたため、C2 / C2E以上の状態はありませんが、主な利得は最初のアイドル状態で発生したようです。私は古いPentium 4を持っており、Linuxはコア温度を10〜15C低下させるC1のみをサポートしています。 Core i7を使用した実験では、C3またはC6が活性化されたときに温度がわずかに低下することが示された。しかし、バッテリーの節約効果はまだ価値があると思うかもしれません。上記のように設定された待ち時間に関して、目に見えるパフォーマンスの問題は見つかりませんでしたが、決してハードコアゲームではありません。

関連情報