次の方法で共有


NVMe

このセクションでは、Microsoft のインボックス NVMe ドライバー(StorNVMe)がどのように電力を管理し、どのような構成オプションが利用できるかについて詳しく説明します。 NVMe 仕様では、NVMe デバイスが最大 32 の電源状態をレポートできるようになっています。 各電源の状態には、次のパラメーターがあります:

  • 最大電力消費量(MP)
  • 操作または非操作
  • エントリの待機時間 (ENLAT)
  • 終了待機時間 (EXLAT)
  • 相対的なパフォーマンス値 (他の電源の状態と比較)

StorNVMe は operational power states (デバイスはこれらの状態で IO を処理できる) を ロジカル パフォーマンス状態 (通称 P-State) にマッピングします。 同様に、ドライバーは非動作電源状態 (デバイスはこれらの状態でIOを処理しない) を論理的なアイドル電源状態 (別名:F-State) にマッピングします。 StorNVMe では、これらの切り替えは、システム全体の電源状態によって大きく左右されます。 NVMe の仕様では、自律的な電源状態遷移 (APST) 機能が定義されています。 Modern Standby のサポートのため、StorNVMe は APST が有効なデバイスをサポートしません。

ランタイムデバイスの電源管理

StorNVMe は、一定のアイドル時間が経過した後、デバイスを F 状態に移行することを選択できます。 F 状態は、3 つの要素に基づいて選択されます:

  1. 待機時間の許容範囲。これは、必要に応じてデバイスがどれだけ迅速に応答できるかを示します。 F1 の場合、TransitionLatency (ENLAT + EXLAT) はプライマリ遷移の待機時間の許容範囲よりも大きくすることはできません。 F2 およびその他のより深い F 状態 (あれば) の場合、TransitionLatency はセカンダリ遷移の待機時間の許容範囲よりも大きくすることはできません。 そうしなければ、デバイスはこれらの F 状態に移行できず、モダン スタンバイ遷移が影響を受ける可能性があります (たとえば、DRIPS を入るのに長い待機時間が発生します)。
  2. アイドル タイムアウト。 これは、デバイスが最後の IO 操作を完了してからの経過時間です。
  3. システム電源の状態。 システムがアクティブに使用されている場合、StorNVMe は応答性を優先します。 これは、さまざまな待機時間の許容範囲とタイムアウトが使用されます。

この表は、StorNVMe で使用される既定のアイドルタイムアウトと待機時間の許容範囲が示されています。 これらの設定を変更する方法については、「電源構成設定」セクションを参照してください。

ACPI システム電源状態 プライマリ アイドル タイムアウト プライマリ切り替え遅延の許容範囲 セカンダリ アイドル タイムアウト セカンダリ 切り替え遅延の許容範囲
S0 (処理中)-パフォーマンス スキーム 200ms 0ms (AC) / 10ms (DC) 2000ms 0ms
S0 (処理中)- バランス スキーマ 200ms (AC) / 100ms (DC) 15ms (AC) / 50ms (DC) 2000ms (AC) / 1000ms (DC) 100ms
S0 (処理中)- 省電力 スキーマ 100ms 100ms (AC) / 200ms (DC) 1000ms 200ms
S0 低電力アイドル (モダン スタンバイ) 50 ミリ秒 500ms 該当なし 該当なし

アイドルタイムアウトが終了すると、ドライバーは内部の電源状態のテーブルをたどり、ENLAT+EXLAT が現在の切り替え遅延の許容値以下の最も深い電源状態を選択します。

例えば、NVMe デバイスに以下の電源状態があり、アイドルタイムアウトが発生したと仮定します:

電源状態 エントリの待機時間 (ENLAT) 終了待機時間 (EXLAT)
PS0 5us 5us
PS1 10ms 300us
PS2 50 ミリ秒 10ms

システムが DC 電源でモダン スタンバイではない場合、StorNVMe は (ENLAT+EXLAT)<=50ms の最も深い電源状態であるため、PS1 を選択します。 同様に、システムがモダン スタンバイになると、StorNVMe は (ENLAT+EXLAT) <= 500ms の最も深い電源状態であるため、PS2 を選択します。

モダン スタンバイと DRIPS

モダン スタンバイを完全にサポートするために、StorNVMe はハードウェア プラットフォームが提供するヒントに応じて、デバイスを適切な低電力状態に移行させます。 アイドル状態は、F 状態(F0 よりも深い)から D3 Cold までの間で変化します。 一部のプラットフォームでは、モダン スタンバイ時に D3 Cold が必要となります。 これは SoC によって異なりますので、詳細についてはシリコン ベンダにご確認ください。 モダン スタンバイ システム上のストレージ デバイスの D3 サポートは、こちらの説明に従って有効にすることができます。

モダン スタンバイ システムがシステム Resume Latency の要件である 1 秒を満たすために、デバイスは短いレジューム遅延で RTD3 をサポートする必要があります。 RTD3 Resume Latency (RTD3R) は、D3cold からの Resume Latency を示しており、0 以外の値 ≤ 100 ミリ秒を報告することをお勧めします。 RTD3R は、NVMe 仕様の 8.4.4 項に記載されています。

電源構成の設定

Windows 10 は、エネルギー効率を調整するために、以下の NVMe 電源構成をサポートしています。

プライマリ NVMe アイドル タイムアウト

次の電源構成設定を使用すると、StorNVMe によって使用されるプライマリデバイスの アイドルタイムアウトを変更できます。

Power Setting GUID: d639518a-e56d-4345-8af2-b9f32fb26109  (Primary NVMe Idle Timeout)
      Minimum Possible Setting: 0x00000000
      Maximum Possible Setting: 0x0000ea60
      Possible Settings increment: 0x00000001
      Possible Settings units: milliseconds

次の電源構成設定では、StorNVMe がアイドル状態を計算する際に使用するプライマリ遷移レイテンシーの許容値を変更できます。 これは、アイドル タイムアウトが切れたときに ENLAT と EXLAT の値の合計と比較される値です。 この値が大きいほど、より深い電力構成状態が選択される可能性が高くなります。

Power Setting GUID: fc95af4d-40e7-4b6d-835a-56d131dbc80e  (Primary NVMe Power State Transition Latency Tolerance)
      Minimum Possible Setting: 0x00000000
      Maximum Possible Setting: 0x0000ea60
      Possible Settings increment: 0x00000001
      Possible Settings units: milliseconds

セカンダリ NVMe アイドル タイムアウト

追従する電源構成設定では、StorNVMe で使用されるセカンダリ デバイスのアイドル タイムアウトを変更できます。

Power Setting GUID: d3d55efd-c1ff-424e-9dc3-441be7833010  (Secondary NVMe Idle Timeout)
      Minimum Possible Setting: 0x00000000
      Maximum Possible Setting: 0x0000ea60
      Possible Settings increment: 0x00000001
      Possible Settings units: milliseconds

追従する電源構成設定では、StorNVMe がアイドル状態を計算する際に使用するセカンダリ切り替え遅延の許容範囲を変更することができます。 これは、アイドル タイムアウトが切れたときに ENLAT と EXLAT の値の合計と比較される値です。 この値が大きいほど、より深い電力構成状態が選択される可能性が高くなります。

Power Setting GUID: dbc9e238-6de9-49e3-92cd-8c2b4946b472  (Secondary NVMe Power State Transition Latency Tolerance)
      Minimum Possible Setting: 0x00000000
      Maximum Possible Setting: 0x0000ea60
      Possible Settings increment: 0x00000001
      Possible Settings units: milliseconds

与えられた電源設定の値を変更するには、次のように使用します:

powercfg [-setacvalueindex | -setdcvalueindex] <scheme> sub_disk <Power Setting GUID> <milliseconds>

powercfg –setactive <scheme> を使用して値を適用することを忘れないでください。

PCIe ASPM と L1 のサブ状態

プラットフォームによっては、NVMe デバイスが AC 電源ではなく DC 電源の場合に L1 サブ状態に入ることができます。 この場合は、PCIe ASPM の電源構成設定を変更して、AC 電源 (DC 電源に加えて) の電力の節約効果を最大にすることが必要になる場合があります。

Power Setting GUID: ee12f906-d277-404b-b6da-e5fa1a576df5  (Link State Power Management)
      GUID Alias: ASPM
      Possible Setting Index: 000
      Possible Setting Friendly Name: Off
      Possible Setting Index: 001
      Possible Setting Friendly Name: Moderate power savings
      Possible Setting Index: 002
      Possible Setting Friendly Name: Maximum power savings

値を変更するには、次のように使用します:

powercfg -setacvalueindex <scheme> sub_pciexpress aspm <value>

上の Index 002 を使用すると、省電力を最大限に節約できます。 powercfg –setactive <scheme> を使用して値を適用することを忘れないでください。

アクティブな電源管理

アクティブな電源管理には、"P 状態" (パフォーマンスまた ""パフォーマンス" 状態) が関係しており、主に熱制御が想定されています。 StorNVMe は、各動作電力状態について報告された最大電力値を使用して、デバイスの動作電力状態を論理的な P 状態にマップします。 デバイスがアクティブになっている場合 (つまり、未処理の IO がある場合)、StorNVMe は、P 状態切り替えを介して、デバイスを運用中の電源状態のいずれかに切り替えます。

Windows 10 の開発期間中、複数の操作可能な電源状態を実装した NVMe デバイスは限られていました。 消費電力とパフォーマンスの測定結果によると、最高の操作電力状態以外を使用することに大きなメリットはありませんでした。 そのため、既定の構成では、使用されている操作の電源の最高状態のみが表示されます。

選択される操作電力状態は、現在の "最大動作電力" のヒントに依存します。 このヒントには 3 つの異なるソースがあります:

  • Windows Thermal Framework からの passive cooling コールバック。
  • 最大電源レベルの電源構成設定値の変更。 (これは、システム電源設定または AC/DC 電源の変更によってトリガーされます。)
  • IOCTL_STORAGE_DEVICE_POWER_CAP の要求。 これらのソースの中で最も低い最小値が、実効的な最大操作電力値となります。 これらの各ソースのメカニズムについては、後述します。

一般に、StorNVMe は、操作能力の最大値以下の最高の操作電源状態を選択します。

たとえば、NVMe デバイスの電源の状態が次のようになっているとします:

電源状態 最大電力 操作
PS0 9W はい
PS1 6W はい
PS2 4W はい

これらのソースの中で最も低い最小値が、実効的な最大操作電力値となります。 これらの各ソースのメカニズムについては、後述します。

一般に、StorNVMe は、操作能力の最大値以下の最高の操作電源状態を選択します。

既定では、最大電力レベルは存在しないため、StorNVMe は常に PS0 を選択します。 これは 100% に相当します。

Windows Thermal Framework がパッシブクーリングコールバックを 50% の値で呼び出すと、絶対的な電力値は(50% * (9W – 4W)) + 4W = 6W となります。 その後、StorNVMe は、デバイスがアクティブになると常に PS1 になります。これは、その状態の最大電力値が 6W であるためです。

その後、一部のユーザー モード プロセスは、値が 5W のディスクに IOCTL_STORAGE_DEVICE_POWER_CAP 要求を送信します。 StorNVMe は、最大電力値 (4W) が最大操作電力要件である 5W を下回るため、この場合は PS2 を選択します。

与えられた最大操作電力要件が、最も低い操作電力状態の Max Power 値よりも小さい場合、単純に最も低い操作電力状態を選択することが期待されます。 この例では、指定された最大操作電力要件が3Wであった場合、StorNVMe は PS2 を選択しますが、これは Max Power 値が 3W 以下の操作電力状態がないためです。

その後、最大操作電力要件が 9W に変更された場合、StorNVMe はデバイスがアクティブなときに PS0 を選択するように戻ります。

たとえば、NVMe デバイスの電源の状態が次のようになっているとします:

Windows サーマル フレームワーク パッシブ冷却コールバック

StorNVMe(Storport 経由)は、Windows Thermal Framework に熱冷却インターフェースを登録し、システムがそのフレームワークを通じて NVMe デバイスを調節することを可能にします。 この詳細については、このドキュメントでは説明しませんが、一般的には、プラットフォームが ACPI を介してサーマル ゾーンとしきい値を指定し、Windows Thermal Framework がデバイスのドライバーへのコールバックを介してデバイスを調節するために使用します。

最大操作電力レベルの電源構成設定

追従する電源構成設定は、異なるシステム電源設定および AC/DC 電源に対する最大操作電力レベルを変更するために使用できます。

Power Setting GUID: 51dea550-bb38-4bc4-991b-eacf37be5ec8  (Maximum Power Level)
      GUID Alias: DISKMAXPOWER
      Minimum Possible Setting: 0x00000000
      Maximum Possible Setting: 0x00000064
      Possible Settings increment: 0x00000001
      Possible Settings units: %

与えられた電源設定の値を変更するには、次のように使用します:

powercfg [-setacvalueindex | -setdcvalueindex] <scheme> sub_disk 51dea550-bb38-4bc4-991b-eacf37be5ec8 <value>

powercfg –setactive <scheme> を使用して値を適用することを忘れないでください。

IOCTL_STORAGE_DEVICE_POWER_CAP

この IOCTL は、最大操作電力レベルを変更するためにストレージデバイスに送ることができます。 詳細については、STORAGE_DEVICE_POWER_CAP 入力および出力バッファーのドキュメントを参照してください。

シャットダウンまたは休止状態

システムがシャットダウンまたは休止状態の場合、StorNVMe はデバイスのシャットダウン通知 (CC.SHN) フィールドを 1 に設定します。 StorNVMe は次に、デバイス の報告された RTD3 エントリの待機時間を待って、デバイスが準備完了を示すようにします (そのために、シャットダウン状態 (CSTS.SHST) フィールドを 2 に更新します)。 エントリの待機時間の値が報告されない場合、StorNVMe では既定値の 5 秒が使用されます。 この場合、デバイスに 5 秒以上かかると、システムは NVMe デバイスをそれ以上確認せずに、シャットダウンまたは休止状態の手順を続行します。 Oem は、最新のスタンバイシステムのために RTD3 のエントリーおよびエグジットの値を報告するデバイスのみを使用してください。