NVMe

In diesem Abschnitt wird erläutert, wie Microsofts In-Box NVMe-Treiber (StorNVMe) Power verwaltet und welche Konfigurationsoptionen verfügbar sind. Mit der NVMe-Spezifikation können NVMe-Geräte bis zu 32 Leistungszustände melden. Jeder Energiezustand verfügt über die folgenden Parameter:

  • Maximaler Stromverbrauch
  • Betriebs- oder nicht betriebsfähig
  • Einstiegslatenz (ENLAT)
  • Beenden der Latenz (EXLAT)
  • Relative Leistungswerte (relativ zu anderen Leistungszuständen)

StorNVMe ordnet Betriebskraftzustände (das Gerät kann IO in diesen Zuständen behandeln) zu logischen Leistungszuständen (a.k.a. P-States). Ebenso ordnet der Treiber nicht betriebsfähige Power-Zustände (das Gerät behandelt IO in diesen Zuständen nicht) zu logischen Leerlauf-Stromzuständen (a.k.a. F-Zustände). Mit StorNVMe wird der Übergang zu diesen Zuständen weitgehend durch den Gesamtbetriebszustand des Systems bestimmt. Die NVMe-Spezifikation definiert ein Autonomes Power State Transition (APST)-Feature. Für die Unterstützung für modern Standby unterstützt StorNVMe Geräte mit aktivierter APST nicht.

Energieverwaltungsmodi des Geräts

StorNVMe kann sich entscheiden, das Gerät in einen F-Zustand umzusteigen, nachdem eine bestimmte Zeit im Leerlauf abgelaufen ist. Der F-Staat wird basierend auf 3 Faktoren ausgewählt:

  1. Latenztoleranz, d. h. wie schnell das Gerät bei Bedarf reagieren kann. Bei F1 sollte die TransitionLatency (ENLAT + EXLAT) nicht größer sein als die Toleranz für die Latenz für den primären Übergang. Für F2 und andere tiefere F-Zustände (falls vorhanden) sollte die TransitionLatency nicht größer sein als die Latenztoleranz für sekundären Übergang. Andernfalls kann das Gerät möglicherweise nicht zu diesen F-Zuständen wechseln, und der moderne Standby-Übergang kann beeinträchtigt werden (für instance führen Sie lange Latenz beim Eintritt in DRIPS).
  2. Leerlauftimeout. Dies ist die Zeitspanne, die vergeht, seit das Gerät seine letzte E/A-Vorgang abgeschlossen hat.
  3. System-Power-Status. Wenn das System aktiv verwendet wird, bevorzugt StorNVMe die Reaktionsfähigkeit. Dies bedeutet, dass unterschiedliche Latenztoleranzen und Timeouts verwendet werden.

Die Tabelle zeigt die standardmäßigen Leerlauf-Timeouts und Latenztoleranzen, die von StorNVMe verwendet werden. Weitere Informationen zum Ändern dieser Einstellungen finden Sie im Abschnitt Power Configuration Settings.

ACPI-Systemstromstatus Primärer Leerlauf-Timeout Primäre Übergangswartezeittoleranz Sekundäres Leerlauf-Timeout Sekundäre Übergangswartezeittoleranz
S0 (Working) - Leistungsschema 200ms 0ms (AC) / 10ms (DC) 2000ms 0 ms
S0 (Working) - Ausgewogenes Schema 200ms (AC) / 100ms (DC) 15ms (AC) / 50ms (DC) 2000ms (AC) / 1000ms (DC) 100ms
S0 (Working) – Power Saver-Schema 100ms 100ms (AC) / 200ms (DC) 1000ms 200ms
S0 Low Power Idle (Modern Standby) 50 ms 500ms

Sobald das Leerlauftimeout abgelaufen ist, durchläuft der Treiber seine interne Tabelle der Leistungszustände und wählt den tiefen Leistungszustand aus, in dem ENLAT+EXLAT kleiner oder gleich der aktuellen Übergangslatenztoleranz ist.

Angenommen, ein NVMe-Gerät weist die folgenden Leistungszustände auf, und dass ein Leerlauf-Timeout aufgetreten ist:

Betriebszustand Einstiegslatenz (ENLAT) Beenden der Latenz (EXLAT)
PS0 5us 5us
PS1 10 ms 300us
PS2 50 ms 10 ms

Wenn sich das System auf DC-Strom befindet und nicht in Modern Standby ist, wählt StorNVMe PS1 aus, da dies der tiefste Leistungszustand ist, in dem (ENLAT+EXLAT) <= 50Ms vorhanden ist. Ebenso wählt StorNVMe, wenn das System modern Standby eingibt, PS2 aus, da es sich um den tiefsten Leistungszustand handelt, in dem (ENLAT+EXLAT) <= 500Ms vorhanden ist.

Modern Standby und DRIPS

Um modern Standby vollständig zu unterstützen, übergibt StorNVMe das Gerät je nach Hinweis auf die Hardwareplattform auf einen geeigneten Zustand mit niedriger Leistung. Der Leerlaufzustand variiert zwischen einem F-Zustand (tiefer als F0), bis D3 Cold. Einige Plattformen erfordern D3 Cold bei modern Standby. Dies hängt von der SoC ab, daher überprüfen Sie bitte ihren Siliconanbieter, um weitere Informationen zu finden. D3-Unterstützung für Speichergeräte auf modernen Standbysystemen kann wie hier beschrieben aktiviert werden.

Geräte sollten RTD3 mit kurzer Wiederaufnahmelatenz unterstützen, damit moderne Standby-Systeme die Anforderung von 1 Sekunde Systemwiederaufnahmelatenz erfüllen können. RTD3 Resume Latency (RTD3R) bezieht sich auf die Fortsetzungslatenz von D3cold und wird empfohlen, einen nichtzero-Wert ≤ 100 ms zu melden. RTD3R wird im Abschnitt 8.4.4 der NVMe-Spezifikation beschrieben.

Konfigurationseinstellungen

Windows 10 unterstützt die folgenden NVMe-Energieeinstellungen zum Optimieren der Energieeffizienz.

Primäre NVMe-Idle-Timeout

Mit der folgenden Einstellung für die Energiekonfiguration können Sie das von StorNVMe verwendete Timeout des primären Geräts ändern.

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

Mit der folgenden Einstellung für die Power-Konfiguration können Sie den primären Latenzwert ändern, den StorNVMe beim Berechnen eines Leerlaufzustands verwendet. Dies ist der Wert, der mit der Summe der Werte ENLAT und EXLAT verglichen wird, wenn das Leerlauf-Timeout abläuft. Je höher dieser Wert ist, desto wahrscheinlicher, dass ein tieferer Machtzustand ausgewählt wird.

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

Sekundäres NVMe-Idle-Timeout

Mit der folgenden Energiekonfigurationseinstellung können Sie das von StorNVMe verwendete Leerlaufzeitlimit für sekundäre Geräte ändern.

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

Mit der folgenden Einstellung für die Power-Konfiguration können Sie den sekundären Latenzwert ändern, den StorNVMe beim Berechnen eines Leerlaufzustands verwendet. Dies ist der Wert, der mit der Summe der Werte ENLAT und EXLAT verglichen wird, wenn das Leerlauf-Timeout abläuft. Je höher dieser Wert ist, desto wahrscheinlicher, dass ein tieferer Machtzustand ausgewählt wird.

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

Um den Wert für ein bestimmtes Leistungsschema zu ändern, verwenden Sie Folgendes:

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

Vergessen Sie nicht, den Wert anzuwenden, indem Sie Folgendes verwenden: powercfg –setactive <scheme>

PCIe ASPM- und L1-Unterzustände

Je nach Plattform können Sie feststellen, dass das NVMe-Gerät L1-Unterzustände eingeben kann, wenn es sich bei DC-Strom, aber nicht um Ac-Strom handelt. In diesem Fall müssen Sie möglicherweise die Einstellung der PCIe ASPM-Power-Konfiguration ändern, sodass sie maximale Stromeinsparungen erhält, wenn sie auf AC-Strom (zusätzlich zu DC-Strom).

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

Um den Wert zu ändern, verwenden Sie:

powercfg -setacvalueindex <scheme> sub_pciexpress aspm <value>

mit Index 002 von oben für maximale Stromeinsparungen. Vergessen Sie nicht, den Wert anzuwenden, indem Sie Folgendes verwenden: powercfg –setactive <scheme>

Aktivieren Sie die Energieverwaltung.

Aktive Energieverwaltung umfasst "P-States" (a.k.a. Leistungs- oder "Perf"-Zustände) und ist in erster Linie für die Wärmesteuerung vorgesehen. StorNVMe ordnet die Betriebszustände des Geräts logischen P-Zuständen zu, indem der maximale Leistungswert verwendet wird, der für jeden Betriebszustand gemeldet wird. Wenn das Gerät aktiv ist (d. h. ausstehende E/A hat), wechselt StorNVMe das Gerät über einen P-State-Übergang in einen seiner Betriebszustände.

Während der Entwicklung von Windows 10 gab es eine begrenzte Anzahl von NVMe-Geräten, die mehr als einen betrieblichen Energiezustand implementierten. Basierend auf unseren Leistungs- und Leistungsmessungen haben wir keinen signifikanten Vorteil darin gefunden, einen anderen als den höchsten Betriebsleistungszustand zu verwenden. Daher sehen Sie bei der Standardkonfiguration nur den höchsten verwendeten Betriebsstromzustand.

Der gewählte Betriebsleistungszustand hängt von dem aktuellen Hinweis „maximale Betriebsleistung“ ab. Dieser Hinweis kann 3 verschiedene Quellen aufweisen:

  • Ein Rückruf für passive Kühlung vom Windows Thermal Framework.
  • Eine Änderung des Konfigurationseinstellungswerts für die maximale Leistungsstufe. (Dies kann durch eine Änderung des Systemstromschemas oder einer AC/DC-Stromquelle ausgelöst werden.)
  • Eine IOCTL_STORAGE_DEVICE_POWER_CAP Anforderung. Der niedrigste Maximalwert aus diesen Quellen ist der effektive maximale Betriebsleistungswert. Die Mechanik jeder dieser Quellen wird unten erläutert.

Im Allgemeinen wählt StorNVMe den höchsten Betriebsleistungszustand, der kleiner oder gleich dem effektiven maximalen Betriebsleistungswert ist.

Angenommen, ein NVMe-Gerät verfügt über die folgenden Leistungszustände:

Betriebszustand Maximale Leistung Betriebsbereit?
PS0 9W Ja
PS1 6W Ja
PS2 4W Ja

Der niedrigste Maximalwert aus diesen Quellen ist der effektive maximale Betriebsleistungswert. Die Mechanik jeder dieser Quellen wird unten erläutert.

Im Allgemeinen wählt StorNVMe den höchsten Betriebsleistungszustand, der kleiner oder gleich dem effektiven maximalen Betriebsleistungswert ist.

Standardmäßig gibt es keine maximale Leistungsstufe, daher wählt StorNVMe immer PS0 aus. Dies entspricht 100 %.

Wenn das Windows Thermal Framework den passiven Kühlrückruf mit einem Wert von 50 % aufruft, führt dies zu einem absoluten Leistungswert von (50 % * (9W – 4W)) + 4W = 6W. StorNVMe stellt dann sicher, dass, wenn das Gerät aktiv ist, immer in PS1 vorhanden ist, da der Max Power-Wert dieses Zustands 6W beträgt.

Anschließend sendet ein Benutzermodusprozess eine IOCTL_STORAGE_DEVICE_POWER_CAP Anforderung an den Datenträger mit einem Wert von 5W. StorNVMe wählt NUN PS2 aus, da es sich um den höchsten Betriebsleistungszustand handelt, dessen Max Power-Wert (4W) kleiner als der maximale Betriebsleistungsbedarf von 5W ist.

Wenn die angegebene maximale Betriebskraftanforderung kleiner als der Max Power-Wert des niedrigsten Betriebsleistungszustands ist, besteht die Erwartung darin, einfach den niedrigsten Betriebsbetriebszustand auszuwählen. Wenn in unserem Beispiel die angegebene maximale Betriebsleistung 3W war, würde StorNVMe PS2 auswählen, da er keinen Betriebskraftzustand mit einem Max Power-Wert von 3W oder weniger aufweist.

Wenn sich später die maximale Betriebsleistung auf 9W ändert, wechselt StorNVMe zurück, um PS0 auszuwählen, wenn das Gerät aktiv ist.

Angenommen, ein NVMe-Gerät verfügt über die folgenden Leistungszustände:

Windows Thermal Framework Passive Cooling Callback

StorNVMe (via Storport) registriert eine Wärmekühlungsschnittstelle mit dem Windows Thermal Framework, wodurch es dem System ermöglicht, das NVMe-Gerät über dieses Framework zu drosseln. Die Einzelheiten dazu liegen außerhalb des Rahmens dieses Dokuments, aber im Allgemeinen gibt die Plattform thermische Zonen und Schwellenwerte über ACPI an, die das Windows Thermal Framework dann verwendet, um Geräte über Rückrufe an die Gerätetreiber zu drosseln.

Maximale Betriebsleistung Leistungskonfigurationseinstellung

Die folgende Energiekonfigurationseinstellung kann verwendet werden, um den maximalen Betriebsleistungspegel für verschiedene Systemenergieschemata und AC/DC-Stromquellen zu ändern.

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: %

Um den Wert für ein bestimmtes Leistungsschema zu ändern, verwenden Sie Folgendes:

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

Vergessen Sie nicht, den Wert anzuwenden, indem Sie Folgendes verwenden: powercfg –setactive <scheme>

IOCTL_STORAGE_DEVICE_POWER_CAP

Diese IOCTL kann an eine Speichervorrichtung gesendet werden, um den maximalen Betriebsleistungspegel zu ändern. Weitere Informationen finden Sie in der Dokumentation für den Eingabe-/Ausgabepuffer STORAGE_DEVICE_POWER_CAP.

Herunterfahren/Ruhezustand

Wenn das System heruntergefahren oder in den Ruhezustand versetzt wird, setzt StorNVMe das Feld Shutdown Notification (CC.SHN) des Geräts auf 1. StorNVMe wartet dann auf die gemeldete RTD3-Eintragslatenz des Geräts, damit das Gerät anzeigt, dass es bereit ist (durch Aktualisieren des Felds Shutdown Status (CSTS.SHST) auf 2). Wenn kein Wert für die Eingangslatenz gemeldet wird, verwendet StorNVMe einen Standardwert von 5 Sekunden. Wenn das Gerät in diesem Fall länger als 5 Sekunden benötigt, fährt das System mit dem Herunterfahren oder dem Ruhezustand fort, ohne das NVMe-Gerät weiter zu prüfen. OEMs sollten nur Geräte verwenden, die RTD3-Eingangs- und Ausgangswerte für moderne Standby-Systeme melden.