擦洗控制

版权所有 (c) 2024-2025 华为技术有限公司。

作者:

Shiju Jose <shiju.jose@huawei.com>

许可:

GNU 自由文档许可证,版本 1.2,不含不变章节、封面文本和封底文本。(GPL v2 双重许可)

  • 为版本 6.15 编写

简介

DRAM 尺寸和成本的增加使得内存子系统可靠性成为一个重要的关注点。这些模块用于可能损坏的数据会导致昂贵或致命问题的场景。内存错误是导致服务器和工作负载崩溃的主要硬件故障之一。

内存擦洗是一种功能,其中 ECC(错误纠正码)引擎从每个内存介质位置读取数据,必要时进行纠正,并将纠正后的数据写回同一内存介质位置。

DIMM 可以以可配置的速率进行擦洗,以检测未纠正的内存错误并尝试从检测到的错误中恢复,从而提供以下好处:

  1. 主动擦洗 DIMM 可减少可纠正错误变为不可纠正错误的可能性。

  2. 当检测到未分配内存页面中的未纠正错误时,将其隔离并防止分配给应用程序或操作系统。

  3. 这降低了软件或硬件产品遇到内存错误的几率。

  4. 关于内存故障的附加数据可用于建立统计信息,这些统计信息随后用于决定是否使用内存修复技术,例如封装后修复或备用。

内存擦洗分为 2 种类型:

  1. 后台(巡逻)擦洗,发生在 DRAM 空闲时。

  2. 按需擦洗,针对特定的地址范围或内存区域。

已识别出多种硬件内存擦洗器接口,例如 CXL 内存设备巡逻擦洗、CXL DDR5 ECS、ACPI RAS2 内存擦洗和 ACPI NVDIMM ARS(地址范围擦洗)。

不同内存擦洗器的控制机制各不相同。为了实现标准化的用户空间工具,需要通过标准化的 ABI 来呈现这些控制。

通用的内存 EDAC 擦洗控制允许用户通过标准化的 sysfs 控制接口管理系统中的底层擦洗器。它将各种擦洗功能的管理抽象为一组统一的功能。

通用擦洗控制功能的用例

  1. 已识别出多种硬件内存擦洗器接口,包括 CXL 内存设备巡逻擦洗、CXL DDR5 ECS、ACPI RAS2 内存擦洗功能、ACPI NVDIMM ARS(地址范围擦洗)和基于软件的内存擦洗器。

    在已识别的硬件内存擦洗器接口中,有些支持控制巡逻(后台)擦洗(例如,ACPI RAS2、CXL)和/或按需擦洗(例如,ACPI RAS2、ACPI ARS)。然而,不同内存擦洗器之间的擦洗控制接口各不相同,这突出表明需要一个标准化、通用的 sysfs 擦洗控制接口,该接口可供用户空间进行管理和脚本/工具使用。

  2. 用户空间擦洗控制允许用户在必要时禁用擦洗,例如,禁用后台巡逻擦洗或调整擦洗速率以进行性能敏感操作,其中后台活动需要最小化或禁用。

  3. 用户空间工具支持针对特定地址范围的按需擦洗,前提是擦洗器支持此功能。

  4. 用户空间工具还可以通过 sysfs 擦洗控制以可配置的擦洗速率控制内存 DIMM 擦洗。这种方法提供了几个好处:

    4.1. 在用户访问受影响内存之前及早检测到不可纠正的内存错误,有助于促进恢复。

    内存,帮助促进恢复。

    4.2. 降低可纠正错误发展为不可纠正错误的几率。

    错误。

  5. 热插拔内存的策略控制是必要的,因为可能没有系统范围的 BIOS 或类似控制来管理启动后添加的 CXL 设备的擦洗设置。确定这些设置是一个策略决定,需要在可靠性和性能之间取得平衡,因此应由用户空间控制。因此,建议采用统一的接口来处理此功能,使其与其他类似接口保持一致,而不是创建单独的接口。

擦洗功能

CXL 内存擦洗功能

CXL 规范 r3.1 [1] 第 8.2.9.9.11.1 节描述了内存设备巡逻擦洗控制功能。设备巡逻擦洗主动定位并纠正在常规周期中出现的错误。巡逻擦洗控制允许用户空间请求更改 CXL 巡逻擦洗器的配置。

巡逻擦洗控制允许请求者指定巡逻擦洗周期必须完成的小时数,前提是请求的擦洗速率必须在设备支持的擦洗速率范围内。在 CXL 驱动程序中,用户通过 sysfs 请求的每个擦洗周期的秒数将重新缩放为每个擦洗周期的小时数。

此外,它们允许主机在干扰需要关闭后台操作的性能敏感操作时禁用该功能。

错误检查擦洗 (ECS)

CXL 规范 r3.1 [1] 第 8.2.9.9.11.2 节描述了错误检查擦洗 (ECS)——JEDEC DDR5 SDRAM 规范 (JESD79-5) 中定义的一项功能,允许 DRAM 内部读取、纠正单比特错误,并将纠正后的数据比特写回 DRAM 阵列,同时对错误计数保持透明。

DDR5 设备每个设备包含多个内存介质现场可更换单元 (FRU)。DDR5 ECS 功能以及 ECS 控制驱动程序支持按 FRU 配置 ECS 参数。

ACPI RAS2 基于硬件的内存擦洗

ACPI 规范 6.5 [2] 第 5.2.21 节 ACPI RAS2 描述了一个 ACPI RAS2 表,该表提供平台 RAS 功能的接口,并支持系统中同一组件的多个实例的给定 RAS 功能的独立 RAS 控制和能力。

内存 RAS 功能适用于特定于内存的 RAS 能力、控制和操作。内存专用 RAS 功能的 RAS2 PCC 子空间的功能类型为 0x00(内存)。

平台可以使用基于硬件的内存擦洗功能来公开与基于硬件的内存擦洗引擎相关的控制和能力。根据规范,RAS2 内存擦洗功能支持:

  1. 每个 NUMA 域的独立内存擦洗控制,通过其邻近域识别。

  2. 为整个内存系统提供后台(巡逻)擦洗,以及为特定内存区域提供按需擦洗。

ACPI 地址范围擦洗 (ARS)

ACPI 规范 6.5 [2] 第 9.19.7.2 节描述了地址范围擦洗 (ARS)。ARS 允许平台将内存错误通知系统软件。此功能允许系统软件防止访问内存中具有不可纠正错误的地址。ARS 功能管理系统中存在的所有 NVDIMM。在任何给定时间,系统范围内只能进行一次擦洗。

根据规范,支持以下功能:

  1. 查询给定地址范围的 ARS 功能,指示平台支持 ACPI NVDIMM 根设备未消耗错误通知。

  2. 启动 ARS 会触发给定内存范围的地址范围擦洗。地址擦洗可以针对易失性内存或持久性内存,或两者兼而有之。

  3. 查询 ARS 状态命令允许软件获取 ARS 的状态,包括 ARS 的进度和 ARS 错误记录。

  4. 清除不可纠正错误。

  5. 转换 SPA

  6. ARS 错误注入等。

内核支持现有的 ARS 控制,ARS 目前在 EDAC 中不受支持。

各种擦洗功能的比较

名称

ACPI RAS2

CXL 巡逻擦洗

CXL ECS

ARS

按需擦洗

支持

支持

后台擦洗

支持

支持

支持

擦洗模式

每个 NUMA 域的擦洗控制。

按设备

按内存介质

未知

查询擦洗能力

支持

支持

支持

支持

设置地址范围

支持

支持

设置擦洗速率

支持

支持

擦洗速率单位

未定义

以小时为单位

擦洗状态/完成

仅支持按需擦洗

支持

UC 错误报告

例外

CXL 通用介质/DRAM 事件/介质扫描?

CXL 通用介质/DRAM 事件/介质扫描?

ACPI UCE 通知和查询 ARS 状态

支持 EDAC 控制

支持

支持

支持

文件系统

已注册擦洗器实例的控制属性可以在

/sys/bus/edac/devices/<dev-name>/scrubX/

sysfs

Sysfs 文件记录在 ABI file testing/sysfs-edac-scrub

ABI 文件测试/sysfs-edac-ecs

示例

用法采用这些示例中所示的形式

  1. CXL 内存巡逻擦洗

以下是识别出的我们可能需要提高擦洗速率的用例。

  • 由于设备显示意外高错误,因此需要以设备粒度进行擦洗。

  • 擦洗可能适用于尚未完全在线的内存。这很可能是启动时的系统范围默认设置。

  • 以更高速率进行擦洗,因为监控软件已确定特定数据集需要更高的可靠性。这称为差异化可靠性。

1.1. 基于设备的擦洗

CXL 内存通过 CXL 设备暴露给内存管理子系统并最终暴露给用户空间。基于设备的擦洗用于“第 1 节 CXL 内存巡逻擦洗”中描述的第一个用例。

当结合通过设备接口和区域接口进行控制时,请“参见 1.2 节 基于区域的擦洗”。

Sysfs 擦洗文件记录在 ABI file testing/sysfs-edac-scrub

1.2. 基于区域的擦洗

CXL 内存通过 CXL 区域暴露给内存管理子系统并最终暴露给用户空间。CXL 区域表示系统物理地址空间中映射的内存容量。它们可以包含多个 CXL 内存设备的一个或多个部分,流量在它们之间交错。用户可能希望通过这个更抽象的区域来控制擦洗速率,而不是必须找出组成设备并单独对其进行编程。每个设备的擦洗速率覆盖整个设备。因此,如果多个区域使用该设备的部分,则对其他区域的擦洗请求可能导致比此特定区域请求的擦洗速率更高的擦洗速率。

基于区域的擦洗用于“第 1 节 CXL 内存巡逻擦洗”中描述的第三个用例。

用户空间必须遵循以下规则集,以设置任何混合要求的擦洗速率。

  1. 从最低所需擦洗速率到最高所需擦洗速率依次获取每个区域并设置其擦洗速率。后续区域可能会覆盖单个设备(因此可能覆盖整个区域)上的擦洗速率。

  2. 获取需要增强擦洗(更高速率)的每个设备,并设置这些擦洗速率。这将覆盖单个设备的擦洗速率,将其设置为其支持的任何区域所需的最高速率,除非已定义特定速率。

Sysfs 擦洗文件记录在 ABI file testing/sysfs-edac-scrub

  1. CXL 内存错误检查擦洗 (ECS)

错误检查擦洗 (ECS) 功能使内存设备能够执行错误检查和纠正 (ECC) 并计数单比特错误。相关的内存控制器通过向内存设备发送触发器来设置 ECS 模式。CXL ECS 控制允许主机(即用户空间)更改错误计数模式、每个段的错误阈值(指示有多少段至少有该数量的错误)以报告错误,并重置 ECS 计数器。因此,在检测到意外高错误率时,启动内存设备上的错误检查擦洗的责任可能在于内存控制器或平台。

Sysfs 擦洗文件记录在 ABI file testing/sysfs-edac-ecs