本部分详细介绍了Microsoft的内置 NVMe 驱动程序(StorNVMe)如何管理电源以及可用的配置选项。 NVMe 规范允许 NVMe 设备报告高达 32 个电源状态。 每个电源状态都有以下参数:
- 最大能耗(MP)
- 可运行或不可运行
- 输入延迟(ENLAT)
- 退出延迟 (EXLAT)
- 相对性能值(相对于其他电源状态)
StorNVMe 将工作电源状态(在这些状态下设备可以处理 IO)映射到逻辑性能状态(也称为 P 状态)。 同样,驱动程序会将非作电源状态(设备未处理这些状态中的 IO)映射到逻辑空闲电源状态(即 F 状态)。 使用 StorNVMe 时,转换到这些状态在很大程度上取决于整个系统电源状态。 NVMe 规范定义了自治电源状态转换(APST)功能。 对于新式待机支持,StorNVMe 不支持启用了 APST 的设备。
运行时设备电源管理
StorNVMe 可以选择在一定空闲时间过后将设备转换为 F 状态。 根据 3 个因素选择 F 状态:
- 延迟容差,这是设备在需要时能够做出响应的速度。 对于 F1,TransitionLatency (ENLAT + EXLAT)不应大于主要转换延迟容忍度。 对于 F2 和其他更深层的 F 状态(如果有),其转换延迟不应大于二次转换延迟容忍度。 否则,设备可能无法转换到这些 F 状态,新式待机转换可能会受到影响(例如,进入 DRIPS 的延迟很长)。
- 空闲超时。 这是设备完成上一次 IO 操作的时间量。
- 系统电源状态。 如果系统正在使用中,StorNVMe 将优先考虑响应能力。 这意味着将使用不同的延迟容忍度和超时。
该表显示 StorNVMe 使用的默认空闲超时和延迟容差。 有关如何更改这些设置,请参阅 “Power Configuration 设置” 部分。
ACPI 系统电源状态 | 主要空闲超时 | 主转换延迟容差 | 次要空闲超时 | 次级转换延迟容忍度 |
---|---|---|---|---|
S0(工作)- 性能方案 | 200 毫秒 | 0 毫秒 (AC) / 10 毫秒 (DC) | 2000毫秒 | 0 毫秒 |
S0(工作)- 均衡方案 | 200 毫秒 (AC) / 100 毫秒 (DC) | 15 毫秒 (AC) / 50 毫秒 (DC) | 2000ms (AC) / 1000ms (DC) | 100 毫秒 |
S0(工作)- 功耗节省方案 | 100 毫秒 | 100 毫秒 (AC) / 200 毫秒 (DC) | 1000ms | 200 毫秒 |
S0 低功耗空闲(新式待机) | 50 毫秒 | 500 毫秒 | N/A | N/A |
空闲超时过期后,驱动程序将遍历其内部电源状态表,并选择最深层电源状态,其中 ENLAT+EXLAT 小于或等于当前转换延迟容错。
例如,假设一个 NVMe 设备具有以下电源状态,并且已发生空闲超时:
电源状态 | 输入延迟(ENLAT) | 退出延迟 (EXLAT) |
---|---|---|
PS0 | 5us | 5us |
PS1 | 10 毫秒 | 300us |
PS2 | 50 毫秒 | 10 毫秒 |
系统处于直流电源而不处于新式待机状态时,StorNVMe 将选择 PS1,因为这是 (ENLAT+EXLAT) <= 50 毫秒的最深功率状态。 同样,当系统进入新式待机状态时,StorNVMe 将选择 PS2,因为它是 (ENLAT+EXLAT) <= 500 毫秒的最深功率状态。
新式待机和 DRIPS
为了完全支持新式待机,StorNVMe 将根据硬件平台提供的提示将设备转换为适当的低功率状态。 “空闲”状态在 F 状态(深度低于 F0)到 D3 Cold 之间有所不同。 在新式待机状态下,某些平台需要 D3 Cold。 这取决于 SoC,因此请与硅供应商联系以了解详细信息。 可以按 此处所述启用对新式待机系统上存储设备的 D3 支持。
设备应支持具有短恢复延迟的 RTD3,以帮助现代待机系统满足 1 秒系统恢复延迟要求。 RTD3 恢复延迟 (RTD3R) 是指来自 D3cold 的恢复延迟,建议报告 ≤ 100 毫秒的非零值。 NVMe 规范的第 8.4.4 节介绍了 RTD3R。
电源配置设置
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 设备能够在 DC 电源而不是 AC 电源时进入 L1 子状态。 在这种情况下,您可能需要更改 PCIe ASPM 电源配置设置,以便在使用交流电源(以及直流电源)时实现最大限度的省电。
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>
与上方的索引 002 配合使用以获得最佳节能效果。
不要忘记使用以下方法来应用值:powercfg –setactive <scheme>
主动电源管理
主动功率管理涉及“P 状态”(也称为性能或“perf”状态),主要用于热控制。 StorNVMe 使用每个工作电源状态报告的最大功率值,将设备的工作电源状态映射到逻辑P状态。 当设备处于活动状态(即有未完成的 IO 操作)时,StorNVMe 将通过 P 状态转换使设备进入其工作电源状态之一。
在 Windows 10开发期间,有一组有限的 NVMe 设备实现了多个可运行功率状态。 根据我们的电源和性能度量,我们没有发现使用任何运行电源状态(除了最高运行电源状态)有显著的好处。 因此,使用默认配置时,只会看到使用的最高作电源状态。
选择的运行电源状态取决于当前的“最大运行功率”提示。 此提示可以有 3 个不同的源:
- 来自 Windows 热框架的被动冷却回调。
- 最大功率级别功率配置设置值的变化。 (这可以通过系统电源方案或 AC/DC 电源的变化触发。
- IOCTL_STORAGE_DEVICE_POWER_CAP 请求。 这些源的最低最大值是有效的最大作功率值。 下面讨论了其中每个源的机制。
一般情况下,StorNVMe 会选择不高于有效最大运行功率值的最高运行功率状态。
例如,假设 NVMe 设备具有以下电源状态:
电源状态 | 最大功率 | 运作正常吗? |
---|---|---|
PS0 | 9W | 是的 |
PS1 | 6W | 是的 |
PS2 | 4W | 是的 |
这些源的最低最大值是有效的最大作功率值。 下面讨论了其中每个源的机制。
通常,StorNVMe 将选择小于或等于最大有效工作功率值的最高工作电源状态。
默认情况下,没有最大功率级别,因此 StorNVMe 将始终选择 PS0。 这等效于 100%。
如果 Windows 热框架调用值为 50% 的被动冷却回调,则会导致绝对功率值为 (50% * (9W – 4W)) + 4W = 6W。 然后,StorNVMe 将确保当设备处于活动状态时,它将始终处于 PS1 中,因为该状态的最大电源值为 6W。
然后,某些用户模式进程会将IOCTL_STORAGE_DEVICE_POWER_CAP请求发送到值为 5W 的磁盘。 StorNVMe 现在将选择 PS2,因为它是最高作电源状态,其最大电源值(4W)小于 5W 的最大作功率要求。
如果给定的最大作电源要求小于最低作电源状态的最大电源值,则预期只是选择最低运行电源状态。 在我们的示例中,如果给定的最大作电源要求为 3W,则 StorNVMe 会选择 PS2,因为它没有最大功率值为 3W 或更少的作电源状态。
如果以后最大作电源要求更改为 9W,则 StorNVMe 将在设备处于活动状态时返回选择 PS0。
例如,假设 NVMe 设备具有以下电源状态:
Windows 热框架被动冷却回调
StorNVMe(通过 Storport)向 Windows 热管理框架注册热管理接口,使系统能够通过该框架调节 NVMe 设备性能。 这种方法的细节超出了本文档讨论的范围,但一般来说,平台通过 ACPI 指定热区和阈值,然后 Windows 热框架使用这些信息通过对设备的驱动程序进行回调来限制设备。
最大运行功率级别功率配置设置
以下电源配置设置可用于更改不同系统电源方案和 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 进入和退出值的设备。