NVMe

Questa sezione descrive in dettaglio il modo in cui il driver NVMe (StorNVMe) di Microsoft gestisce la potenza e le opzioni di configurazione disponibili. La specifica NVMe consente ai dispositivi NVMe di segnalare fino a 32 stati di alimentazione. Ogni stato di alimentazione ha i parametri seguenti:

  • Consumo massimo di energia (MP)
  • Operativo o non operativo
  • Latenza di ingresso (ENLAT)
  • Uscire dalla latenza (EXLAT)
  • Valori relativi delle prestazioni (relativi ad altri stati di alimentazione)

StorNVMe esegue il mapping degli stati di alimentazione operativa (il dispositivo può gestire gli stati di I/O in questi stati) agli stati di prestazioni logici (a.k.a. P-States). Analogamente, il driver esegue il mapping degli stati di alimentazione non operativi (il dispositivo non gestisce I/O in questi stati) agli stati di alimentazione inattiva logica (a.k.a. F-States). Con StorNVMe, le transizioni a questi stati sono in gran parte determinate dallo stato complessivo della potenza del sistema. La specifica NVMe definisce una funzionalità di transizione autonoma di Power State Transition (APST). Per il supporto di Standby moderno, StorNVMe non supporta i dispositivi con APST abilitato.

Gestione energia del dispositivo di runtime

StorNVMe può scegliere di passare il dispositivo a un F-State dopo un determinato intervallo di tempo di inattività trascorso. Lo stato F viene scelto in base a 3 fattori:

  1. Tolleranza di latenza, che è la velocità con cui il dispositivo può rispondere se necessario. Per F1, la tolleranza di latenza di transizione (ENLAT + EXLAT) non deve essere maggiore della tolleranza di latenza di transizione primaria. Per F2 e altri stati F-stati più profondi (se presenti), la loro transizioneLatenza non deve essere maggiore della tolleranza di latenza di transizione secondaria. In caso contrario, il dispositivo potrebbe non essere in grado di passare a questi stati F e la transizione di standby moderna potrebbe essere interessata (ad esempio, introdurre una latenza lunga per immettere DRIPS).
  2. Timeout inattiva. Questo è il periodo di tempo da quando il dispositivo ha completato l'ultima operazione di I/O.
  3. Stato di alimentazione del sistema. Se il sistema è attivo, StorNVMe preferisce la velocità di risposta. Ciò implica che verranno usate tolleranza di latenza e timeout variabili.

La tabella mostra i timeout di inattività predefiniti e le tolleranze di latenza usate da StorNVMe. Per modificare queste impostazioni, vedere la sezione Impostazioni di configurazione di Power .

Stato di alimentazione del sistema ACPI Timeout di inattività primario Tolleranza di latenza di transizione primaria Timeout di inattività secondario Tolleranza di latenza di transizione secondaria
S0 (lavoro) - Schema di prestazioni 200ms 0ms (AC) / 10ms (DC) 2000ms 0ms
S0 (lavoro) - Schema bilanciato 200ms (AC) / 100ms (DC) 15ms (AC) / 50ms (DC) 2000ms (AC) / 1000ms (DC) 100ms
S0 (lavoro) - Schema di risparmio energia 100ms 100ms (AC) / 200ms (DC) 1000ms 200ms
S0 Low Power Idle (Standby moderno) 50ms 500 ms N/D N/D

Una volta scaduto il timeout di inattività, il driver attraversa la tabella interna degli stati di alimentazione e seleziona lo stato di alimentazione più profondo in cui ENLAT+EXLAT è minore o uguale alla tolleranza di latenza di transizione corrente.

Si supponga, ad esempio, che un dispositivo NVMe disponga degli stati di alimentazione seguenti e che si sia verificato un timeout inattiva:

Stato di alimentazione Latenza di ingresso (ENLAT) Uscire dalla latenza (EXLAT)
PS0 5us 5us
PS1 10ms 300us
PS2 50ms 10ms

Quando il sistema è in alimentazione DC e non in Standby moderno, StorNVMe sceglierà PS1 perché si tratta dello stato di alimentazione più profondo in cui (ENLAT+EXLAT) <= 50ms. Analogamente, quando il sistema entra in Standby moderno, StorNVMe sceglierà PS2 perché è lo stato di alimentazione più profondo in cui (ENLAT+EXLAT) <= 500ms.

Standby moderno e DRIPS

Per supportare completamente Lo standby moderno, StorNVMe passerà il dispositivo a uno stato di bassa potenza appropriato a seconda degli hint forniti dalla piattaforma hardware. Lo stato di inattività varia tra un F-State (più profondo di F0), a D3 Cold. Alcune piattaforme richiedono freddo D3 quando in standby moderno. Ciò dipende dal SoC, quindi controllare con il fornitore del silicio per altre informazioni. Il supporto D3 per i dispositivi di archiviazione nei sistemi di standby moderni può essere abilitato come descritto qui.

I dispositivi devono supportare RTD3 con latenza di ripresa breve per aiutare i sistemi di standby moderni a soddisfare il requisito di latenza di ripresa del sistema 1 secondo. RTD3 Resume Latency (RTD3R) fa riferimento alla ripresa della latenza da D3cold ed è consigliabile segnalare un valore diverso da zero ≤ 100 ms. RTD3R è descritto nella sezione 8.4.4 della specifica NVMe.

Impostazioni di configurazione di Power

Windows 10 supporta le impostazioni di alimentazione NVMe seguenti per ottimizzare l'efficienza energetica.

Timeout di inattività NVMe primario

L'impostazione di configurazione dell'alimentazione seguente consente di modificare il timeout di inattività del dispositivo primario usato da 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

L'impostazione di configurazione dell'alimentazione seguente consente di modificare il valore di tolleranza di latenza di transizione primaria usato da StorNVMe per calcolare uno stato di inattività. Si tratta del valore confrontato con la somma dei valori ENLAT e EXLAT alla scadenza del timeout di inattività. Maggiore è questo valore, più probabile che venga scelto uno stato di alimentazione più profondo.

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

Timeout di inattività NVMe secondario

L'impostazione di configurazione dell'alimentazione seguente consente di modificare il timeout di inattività del dispositivo secondario usato da 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

L'impostazione di configurazione dell'alimentazione seguente consente di modificare il valore di tolleranza di latenza di transizione secondaria usato da StorNVMe durante il calcolo di uno stato inattiva. Si tratta del valore confrontato con la somma dei valori ENLAT e EXLAT alla scadenza del timeout di inattività. Maggiore è questo valore, più probabile che venga scelto uno stato di alimentazione più profondo.

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

Per modificare il valore per uno schema di alimentazione specifico, usare:

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

Non dimenticare di applicare il valore usando: powercfg –setactive <scheme>

Stati secondari PCIe ASPM e L1

A seconda della piattaforma, è possibile osservare che il dispositivo NVMe è in grado di immettere gli stati secondari L1 quando si attiva l'alimentazione DC ma non l'alimentazione ac. In questo caso, potrebbe essere necessario modificare l'impostazione di configurazione dell'alimentazione di PCIe ASPM in modo da ottenere un risparmio di potenza massima quando si attiva l'alimentazione AC (oltre all'alimentazione 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

Per modificare il valore, usare:

powercfg -setacvalueindex <scheme> sub_pciexpress aspm <value>

con Indice 002 da sopra per risparmiare energia massima. Non dimenticare di applicare il valore usando: powercfg –setactive <scheme>

Risparmio energia attiva

Il risparmio energia attiva prevede "P-States" (ovvero prestazioni o stati "perf") ed è destinato principalmente al controllo termico. StorNVMe esegue il mapping degli stati di alimentazione operativa del dispositivo agli stati P logici usando il valore di potenza massima segnalato per ogni stato di alimentazione operativa. Quando il dispositivo è attivo (ad esempio, ha operazioni di I/O in sospeso), StorNVMe eseguirà la transizione del dispositivo a uno dei relativi stati di alimentazione operativa tramite una transizione P-State.

Durante lo sviluppo di Windows 10 era presente un set limitato di dispositivi NVMe che implementavano più di uno stato di alimentazione operativa. In base alla potenza e alle misurazioni delle prestazioni, non abbiamo trovato un vantaggio significativo per l'uso di qualsiasi stato di potenza operativa più elevato. Pertanto, con la configurazione predefinita verrà visualizzato solo lo stato di potenza operativa più elevato usato.

Lo stato di alimentazione operativo scelto dipende dall'hint corrente di "potenza operativa massima". Questo suggerimento può avere 3 origini diverse:

  • Callback di raffreddamento passivo da Windows Thermal Framework.
  • Modifica del valore massimo dell'impostazione di configurazione alimentazione a livello di alimentazione. Può essere attivato da una modifica dello schema di alimentazione del sistema o dell'alimentazione AC/DC.
  • Richiesta di IOCTL_STORAGE_DEVICE_POWER_CAP . Il valore massimo minimo di queste origini è il valore effettivo massimo di potenza operativa. Di seguito sono descritti i meccanismi di ognuna di queste fonti.

In generale, StorNVMe sceglierà lo stato di potenza operativa più alto minore o uguale al valore effettivo massimo di potenza operativa.

Si supponga, ad esempio, che un dispositivo NVMe abbia i seguenti stati di alimentazione:

Stato di alimentazione Potenza massima Operativo?
PS0 9W
PS1 6W
PS2 4W

Il valore massimo minimo di queste origini è il valore effettivo massimo di potenza operativa. Di seguito sono descritti i meccanismi di ognuna di queste fonti.

In generale, StorNVMe sceglierà lo stato di potenza operativa più alto minore o uguale al valore effettivo massimo di potenza operativa.

Per impostazione predefinita, non esiste alcun livello di alimentazione massimo, quindi StorNVMe sceglierà sempre PS0. Equivale al 100%.

Se Windows Thermal Framework chiama il callback di raffreddamento passivo con un valore pari al 50%, ciò comporterà un valore di potenza assoluto pari a (50% * (9W - 4W)) + 4W = 6W. StorNVMe garantisce quindi che quando il dispositivo è attivo sarà sempre in PS1, poiché il valore Max Power di tale stato è 6W.

Un processo in modalità utente invia quindi una richiesta di IOCTL_STORAGE_DEVICE_POWER_CAP al disco con un valore pari a 5W. StorNVMe sceglierà ora PS2 perché è lo stato di potenza operativa più alto il cui valore di potenza massima (4W) è minore del requisito massimo di potenza operativa di 5W.

Se il requisito massimo di potenza operativa specificato è minore del valore di potenza massima dello stato di alimentazione operativa più basso, l'aspettativa è semplicemente scegliere lo stato di potenza operativa più basso. In questo esempio, se il requisito massimo di potenza operativa specificato era 3W, StorNVMe sceglierebbe PS2 perché non ha uno stato di alimentazione operativa con un valore di potenza massima pari o inferiore a 3W.

Se in un secondo momento il requisito massimo di potenza operativa passa a 9W, StorNVMe tornerà a scegliere PS0 quando il dispositivo è attivo.

Si supponga, ad esempio, che un dispositivo NVMe abbia i seguenti stati di alimentazione:

Callback di raffreddamento passivo di Windows Thermal Framework

StorNVMe (tramite Storport) registra un'interfaccia di raffreddamento termico con Windows Thermal Framework, che consente al sistema di limitare il dispositivo NVMe tramite tale framework. Le specifiche di questo documento non rientrano nell'ambito di questo documento, ma in generale la piattaforma specifica le zone termiche e le soglie tramite ACPI che Windows Thermal Framework usa quindi per limitare i dispositivi tramite callback ai driver dei dispositivi.

Impostazione massima configurazione potenza a livello di potenza operativa

L'impostazione di configurazione alimentazione seguente può essere usata per modificare il livello massimo di potenza operativa per diversi schemi di alimentazione di sistema e alimentazione 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: %

Per modificare il valore per uno schema di alimentazione specifico, usare:

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

Non dimenticare di applicare il valore usando: powercfg –setactive <scheme>

IOCTL_STORAGE_DEVICE_POWER_CAP

Questo IOCTL può essere inviato a un dispositivo di archiviazione per modificare il livello massimo di potenza operativa. Per altre informazioni, vedere la documentazione relativa al buffer di input/output STORAGE_DEVICE_POWER_CAP.

Arresto/ibernazione

Quando il sistema viene arrestato o ibernato, StorNVMe imposta il campo Shutdown Notification (CC.SHN) del dispositivo su 1. StorNVMe attende quindi la latenza di immissione RTD3 segnalata del dispositivo per indicare che è pronta (aggiornando lo stato di arresto (CSTS). Campo SHST) su 2). Se non viene segnalato alcun valore di latenza di immissione, StorNVMe userà un valore predefinito di 5 secondi. In questo caso, se il dispositivo richiede più di 5 secondi, il sistema continuerà con la procedura di arresto o ibernazione senza controllare ulteriormente il dispositivo NVMe. Gli OEM devono usare solo i dispositivi che segnalano i valori di ingresso e uscita RTD3 per i sistemi standby moderni.