Compartilhar via


NVMe

Esta seção detalha como o driver NVMe (StorNVMe) da Microsoft gerencia a energia e quais opções de configuração estão disponíveis. A especificação NVMe permite que dispositivos NVMe relatem até 32 estados de energia. Cada estado de energia tem os seguintes parâmetros:

  • Consumo máximo de energia (MP)
  • Operacional ou Não Operacional
  • Latência de entrada (ENLAT)
  • Latência de Saída (EXLAT)
  • Valores de desempenho relativos (em relação a outros estados de energia)

O StorNVMe mapeia estados de energia operacional (o dispositivo pode lidar com E/S nesses estados) para estados de desempenho lógico (também conhecidos como P-States). Da mesma forma, o driver mapeia estados de energia não operacionais (o dispositivo não lida com E/S nesses estados) para estados de energia ociosa lógica (também conhecidos como F-States). Com o StorNVMe, as transições para esses estados são determinadas em grande parte pelo estado geral de energia do sistema. A especificação NVMe define um recurso APST (Transição de Estado de Energia Autônomo). Para suporte a Espera Moderna, o StorNVMe não dá suporte a dispositivos com APST habilitado.

Gerenciamento de Energia do Dispositivo de Runtime

StorNVMe pode optar por fazer a transição do dispositivo para um estado F depois que um determinado tempo ocioso tiver decorrido. O Estado F é escolhido com base em 3 fatores:

  1. Tolerância à latência, que é a rapidez com que o dispositivo pode responder, se necessário. Para F1, a TransitionLatency (ENLAT + EXLAT) não deve ser maior que a Tolerância à Latência de Transição Primária. Para F2 e outros estados F mais profundos (se houver), sua TransitionLatency não deve ser maior que a Tolerância à Latência de Transição Secundária. Caso contrário, o dispositivo pode não ser capaz de fazer a transição para esses estados F, e a transição de espera moderna pode ser afetada (por exemplo, introduzir latência longa para entrar em DRIPS).
  2. Tempo limite ocioso. Essa é a quantidade de tempo de quando o dispositivo concluiu sua última operação de E/S.
  3. Estado de Energia do Sistema. Se o sistema estiver em uso ativo, StorNVMe preferirá a capacidade de resposta. Isso implica que tolerâncias de latência variáveis e tempos limite serão usados.

A tabela mostra os tempos limite ociosos padrão e as tolerâncias de latência usadas pelo StorNVMe. Consulte a seção Configurações do Power Configuration para saber como alterar essas configurações.

Estado de energia do sistema ACPI Tempo limite ocioso primário Tolerância à latência de transição primária Tempo limite ocioso secundário Tolerância à latência de transição secundária
S0 (trabalhando) – Esquema de desempenho 200ms 0ms (AC) / 10ms (DC) 2000ms 0ms
S0 (Funcionando) – Esquema Equilibrado 200ms (AC) / 100ms (DC) 15ms (AC) / 50ms (DC) 2000ms (AC) / 1000ms (DC) 100 ms
S0 (Funcionando) – Esquema de Economia de Energia 100 ms 100ms (AC) / 200ms (DC) 1000ms 200ms
S0 Ocioso de baixa potência (modo de espera moderno) 50 ms 500 ms N/D N/D

Depois que o tempo limite ocioso expirar, o driver percorrerá sua tabela interna de estados de energia e selecionará o estado de energia mais profundo em que ENLAT+EXLAT é menor ou igual à tolerância de latência de transição atual.

Por exemplo, suponha que um dispositivo NVMe tenha os seguintes estados de energia e que tenha ocorrido um tempo limite ocioso:

Estado de energia Latência de entrada (ENLAT) Latência de Saída (EXLAT)
PS0 5us 5us
PS1 10ms 300us
PS2 50 ms 10ms

Quando o sistema estiver na potência DC e não estiver em Espera Moderna, o StorNVMe escolherá PS1, pois esse é o estado de energia mais profundo em que (ENLAT+EXLAT) <= 50ms. Da mesma forma, quando o sistema entra em Espera Moderna, StorNVMe escolherá PS2 porque é o estado de energia mais profundo em que (ENLAT+EXLAT) <= 500ms.

Espera moderna e DRIPS

Para dar suporte total ao Modo de Espera Moderno, o StorNVMe fará a transição do dispositivo para um estado apropriado de baixa potência, dependendo das dicas fornecidas pela plataforma de hardware. O estado ocioso variará entre um estado F (mais profundo que F0) para D3 Cold. Algumas plataformas exigem D3 Cold quando estão em Espera Moderna. Isso depende do SoC, portanto, marcar com seu fornecedor de silício para obter mais informações. O suporte D3 para dispositivos de armazenamento em sistemas de espera modernos pode ser habilitado conforme descrito aqui.

Os dispositivos devem dar suporte ao RTD3 com latência de retomada curta para ajudar os sistemas de Espera Moderna a atender ao requisito de latência de 1 segundo de retomada do sistema. RTD3 RtD3 Resume Latency (RTD3R) refere-se à latência de retomada de D3cold e é recomendável relatar um valor diferente de zero ≤ 100 ms. RTD3R é descrito na seção 8.4.4 da especificação NVMe.

Configurações de Energia

Windows 10 dá suporte às seguintes configurações de energia NVMe para ajustar a eficiência energética.

Tempo limite ocioso de NVMe primário

A configuração de energia a seguir permite alterar o tempo limite ocioso do dispositivo primário usado pelo 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

A configuração de energia a seguir permite alterar o valor de tolerância de latência de transição primária que StorNVMe usa ao calcular um estado ocioso. Esse é o valor que é comparado com a soma dos valores ENLAT e EXLAT quando o tempo limite ocioso expira. Quanto maior esse valor, maior a probabilidade de que um estado de energia mais profundo seja escolhido.

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

Tempo limite ocioso de NVMe secundário

A configuração de energia a seguir permite alterar o tempo limite ocioso do dispositivo secundário usado pelo 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

A configuração de energia a seguir permite alterar o valor de tolerância à latência de transição secundária que StorNVMe usa ao calcular um estado ocioso. Esse é o valor que é comparado com a soma dos valores ENLAT e EXLAT quando o tempo limite ocioso expira. Quanto maior esse valor, maior a probabilidade de que um estado de energia mais profundo seja escolhido.

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

Para alterar o valor de um determinado esquema de energia, use:

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

Não se esqueça de aplicar o valor usando: powercfg –setactive <scheme>

Sub-estados PCIe ASPM e L1

Dependendo de sua plataforma, você pode observar que o dispositivo NVMe é capaz de inserir sub-estados L1 quando estiver na energia DC, mas não na energia AC. Nesse caso, talvez seja necessário alterar a configuração de energia do PCIe ASPM, de modo que ela obtenha economia máxima de energia quando estiver na energia do AC (além da energia 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

Para alterar o valor, use:

powercfg -setacvalueindex <scheme> sub_pciexpress aspm <value>

com Índice 002 acima para economia máxima de energia. Não se esqueça de aplicar o valor usando: powercfg –setactive <scheme>

Gerenciamento ativo de energia

O gerenciamento ativo de energia envolve "P-States" (também conhecido como desempenho ou estados "perf") e destina-se principalmente ao controle térmico. StorNVMe mapeia os estados de energia operacional do dispositivo para P-States lógicos usando o valor máximo de energia relatado para cada estado de energia operacional. Quando o dispositivo estiver ativo (ou seja, tiver E/S pendente), o StorNVMe fará a transição do dispositivo para um de seus estados de energia operacional por meio de uma transição de P-State.

Durante Windows 10 desenvolvimento, havia um conjunto limitado de dispositivos NVMe que implementavam mais de um estado de energia operacional. Com base em nossas medidas de energia e desempenho, não encontramos um benefício significativo em usar qualquer, mas o estado de energia operacional mais alto. Portanto, com a configuração padrão, você verá apenas o estado de energia operacional mais alto utilizado.

O estado de energia operacional escolhido depende da dica atual de "potência operacional máxima". Essa dica pode ter três fontes diferentes:

  • Um retorno de chamada de resfriamento passivo da Estrutura Térmica do Windows.
  • Uma alteração no valor máximo da configuração de energia do nível de energia. (Isso pode ser disparado por uma alteração no esquema de energia do sistema ou na fonte de alimentação AC/DC.)
  • Uma solicitação IOCTL_STORAGE_DEVICE_POWER_CAP . O menor valor máximo dessas fontes é o valor máximo efetivo de energia operacional. A mecânica de cada uma dessas fontes é discutida abaixo.

Em geral, o StorNVMe escolherá o estado de energia operacional mais alto que é menor ou igual ao valor máximo efetivo de energia operacional.

Por exemplo, digamos que um dispositivo NVMe tenha os seguintes estados de energia:

Estado de energia Potência máxima Operacional?
PS0 9W Sim
PS1 6W Sim
PS2 4W Sim

O menor valor máximo dessas fontes é o valor máximo efetivo de energia operacional. A mecânica de cada uma dessas fontes é discutida abaixo.

Em geral, o StorNVMe escolherá o estado de energia operacional mais alto que é menor ou igual ao valor máximo efetivo de energia operacional.

Por padrão, não há nível máximo de energia, portanto, StorNVMe sempre escolherá PS0. Isso equivale a 100%.

Se a Estrutura Térmica do Windows chamar o retorno de chamada de resfriamento passivo com um valor de 50%, isso resultará em um valor de energia absoluto de (50% * (9W – 4W)) + 4W = 6W. Em seguida, o StorNVMe garantirá que, quando o dispositivo estiver ativo, ele sempre estará no PS1, pois o valor máximo de energia desse estado é 6W.

Em seguida, algum processo de modo de usuário envia uma solicitação de IOCTL_STORAGE_DEVICE_POWER_CAP para o disco com um valor de 5W. O StorNVMe escolherá PS2 agora porque é o estado de energia operacional mais alto cujo valor máximo de energia (4W) é menor que o requisito máximo de energia operacional de 5W.

Se o requisito máximo de energia operacional fornecido for menor que o valor máximo de energia do estado de energia operacional mais baixo, a expectativa é simplesmente escolher o estado de energia operacional mais baixo. Em nosso exemplo, se o requisito máximo de energia operacional fornecido for 3W, o StorNVMe escolherá PS2 porque não tem nenhum estado de energia operacional com um valor máximo de energia de 3W ou menos.

Se posteriormente o requisito máximo de energia operacional for alterado para 9W, o StorNVMe voltará a escolher PS0 quando o dispositivo estiver ativo.

Por exemplo, digamos que um dispositivo NVMe tenha os seguintes estados de energia:

Retorno de chamada de resfriamento passivo da Estrutura Térmica do Windows

StorNVMe (via Storport) registra uma interface de resfriamento térmico com a Estrutura Térmica do Windows, o que possibilita que o sistema limite o dispositivo NVMe por meio dessa estrutura. As especificidades disso estão fora do escopo deste documento, mas, em geral, a plataforma especifica zonas térmicas e limites via ACPI que a Estrutura Térmica do Windows usa para limitar dispositivos por meio de retornos de chamada para os drivers dos dispositivos.

Configuração máxima de energia no nível de energia operacional

A configuração de energia a seguir pode ser usada para alterar o nível máximo de energia operacional para diferentes esquemas de energia do sistema e fonte de alimentação 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: %

Para alterar o valor de um determinado esquema de energia, use:

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

Não se esqueça de aplicar o valor usando: powercfg –setactive <scheme>

IOCTL_STORAGE_DEVICE_POWER_CAP

Esse IOCTL pode ser enviado para um dispositivo de armazenamento para alterar o nível máximo de energia operacional. Para obter mais informações, consulte a documentação do buffer de entrada/saída, STORAGE_DEVICE_POWER_CAP.

Desligamento/Hibernação

Quando o sistema está sendo desligado ou hibernado, o StorNVMe define o campo CC.SHN (Notificação de Desligamento) do dispositivo como 1. O StorNVMe aguarda a latência de entrada RTD3 relatada do dispositivo para que o dispositivo indique que ele está pronto (atualizando o Status de Desligamento (CSTS). SHST) campo para 2). Se nenhum valor de latência de entrada for relatado, o StorNVMe usará um valor padrão de 5 segundos. Nesse caso, se o dispositivo levar mais de 5 segundos, o sistema continuará com o procedimento de desligamento ou hibernação sem verificar mais o dispositivo NVMe. Os OEMs devem usar apenas dispositivos que relatam valores de entrada e saída RTD3 para sistemas de espera modernos.