可靠性、可用性、可维护性(Reliability、Availability、Serviceability,RAS)的定义和提升手段示例如表2-5所示。
表2-5 RAS的定义和提升手段示例
纠错码(Error Correcting Code,ECC)用来保护持久内存的数据正确性,涉及两个缓存行,这也意味着读操作会读出两个缓存行的数据。而对于写操作,持久内存控制器会尽量同时处理两个缓存行来优化性能。但是对于写一个缓存行,持久内存会通过读—修改—写来完成操作(ECC重新计算)。
持久内存的介质被组织成ECC块,每个ECC块包括4个微处理器缓存行(每个64字节)、4个毒药标志位(对应4个缓存行,存储在元数据中)、其他元数据(每个缓存行的状态)和ECC。
持久内存会预留出一定的空闲块作为备份,空闲块由持久内存的固件来实现。如果持久内存检测到坏块,那么它会放弃坏块,选择新的空闲块。不能修复的数据会从坏块写到空闲块中,正确的ECC值和毒药标志位也会被写入空闲块。毒药标志位表明新的缓存行已经没有正确的数据了,软件如果读取新的缓存行,那么返回的数据将包括毒药标志。
数据毒药是一种错误抑制的方式,它提供了一个有可能恢复介质里不可纠正数据的机制。当发生不可纠正错误(Uncorrectable Error,UCE)时,持久内存控制器会用毒药标记错误数据,并将数据和毒药传给微处理器。
DRAM的毒药机制可以在系统启动时选择启用或者禁止,持久内存的毒药是必需的。对微处理器来说,如果毒药启用了,流程和标准的DRAM毒药一样;如果毒药没有启用,那么系统将产生严重的硬件错误异常。
毒药的一个影响是它延时不可纠正数据的“判断”。在传统的系统硬件错误架构中,当毒药机制被禁止时,不可纠正的数据是致命的错误,它会使系统立刻崩溃。但当毒药机制被启动时,不可纠正的数据则不是立刻致命的,取而代之的是数据被标记成毒药。因此当不可纠正的数据被读取时,进行读数据操作的用户可以决定如何处理被标记成毒药的数据。例如,计算机显卡完全可以忽略被标记成毒药的数据,继续工作,因为一个像素导致屏幕有一个觉察不到的闪光点是完全可以容忍的。如果是微处理器的某个进程或线程来读取数据,硬件会判断这个错误是不是可以恢复,如果硬件认为这个错误是可以恢复的,那么它会用特殊的记号来标记这个错误,这样操作系统或者虚拟机管理进程可以决定是否恢复错误或者怎么恢复错误。
毒药标志位被保存在持久内存介质的元数据里。在内存模式下,系统重启会清除毒药标记;在AD模式下,系统重启不会清除毒药标志位。值得注意的是:如果数据错误的类型是致命的,那么微处理器的上下文内容将被破坏且不能被信任,所以微处理器应该立刻重启系统以恢复到正常状态。
数据块上的毒药可以通过MB命令来清除。
错误检测和恢复是持久内存控制器用来防止持久内存介质的随机比特位错误,目的是维护所传输数据的完整性。如果错误是可以纠正的,持久内存控制器就会纠正数据,这样就可以防止可纠正的错误(Correctable Error,CE)因错误比特位的积累变成不可纠正的错误。下面是三种错误的处理方式。
(1)读操作(可纠正错误)。
当读数据的时候,通过ECC对数据进行校验和纠正。如果数据有误并且被纠正成功,数据就会被传给主机或微处理器。可纠正错误是通过持久内存来完成的,操作系统或主机固件不会参与,并且错误不会被发给主机。
(2)读操作(不可纠正错误)。
当读数据的时候,通过ECC对数据进行校验和纠正。如果从硬件上来说数据不能被纠正,持久内存控制器就会用毒药标记错误,并且传给主机内存控制器,之后系统或者BIOS可以通过软件进行恢复(重试、丢弃或者忽略)。
(3)写操作(毒药区域)。
在写入新数据的时候,数据会被正常写到持久内存介质的毒药区域,同时毒药会被清除。
单芯片数据纠正(Single Device Data Correction,SDDC)用来纠正单个持久内存介质芯片上的比特位错误,延长系统的运行时间,防止数据被破坏。SDDC由持久内存控制器管理,不需要微处理器、BIOS或者操作系统的支持。
(1)可纠正错误。
● 持久内存会纠正数据,并且把纠正好的数据发给主机;
● 可纠正的数据不会被传给微处理器。
(2)不可纠正错误。
● 持久内存控制器会把数据包括毒药标记发给主机;
● 持久内存控制器会在介质里创建一个记录,如果记录被启用,那么中断就会传给主机;
● 持久内存控制器会把出错的数据移到新的数据块,并且在介质里设置毒药标志位。
错误发生以后,虽然持久内存可以继续工作,但是错误检测能力会降低,所以性能会下降。
双设备数据纠正(Double Device Data Correction,DDDC)用来处理两个持久内存介质芯片上的比特位错误,延长系统的运行时间,防止数据被破坏。DDDC由持久内存控制器管理,不需要微处理器、BIOS或操作系统的支持。
当第一个设备失效时,持久内存控制器会利用纠错码重建失效设备上的数据到另外一个空闲设备上,数据重建完成后,持久内存控制器的错误检测和纠正的能力将恢复正常。在第二个设备失效后,虽然持久内存仍然可以通过纠错编码进行数据读写,但是数据纠正功能降低了,所以性能会下降。
持久内存控制器内置了一个刷新引擎用来巡检(Patrol Scrub),持久内存的巡检也被称为顺序刷新,和DRAM的巡检是各自独立运行的。该引擎会利用空闲的机会主动地搜索持久内存,可通过对持久内存的地址进行读操作,也可利用ECC修复可以纠正的错误。用户可以对刷新引擎的频率值进行编程,刷新引擎会根据这个频率对持久内存进行巡检访问,这样就可以有效地防止可纠正错误由于错误比特位的累积变成不可纠正错误。只要有足够的时间,所有的持久内存的地址都会被访问到。
持久内存的巡检通常叫作“刷新”。
● 适用模式:内存模式和AD模式。
● 对于可纠正的错误,持久内存控制器会纠正数据并写回数据。
● 对于不可纠正的错误,持久内存控制器会用毒药在介质的元数据里标记错误,不可纠正错误会被记录到持久内存的介质,然后持久内存控制器会把数据移到新的位置。如果系统设置了中断,那么中断会被发给主机。
● 如果数据已经被标记成毒药,那么巡检时错误不会被记录和上传给系统。
地址区间检查(Address Range Scrub,ARS)是ACPI规范里定义的DSM。BIOS和持久内存驱动可以通过ARS获取不可纠正错误的持久内存地址,以在持久内存被分配给应用程序使用之前获取状况良好的地址范围。和巡检相比,ARS检查内存地址的频率更高,但是更高的检查频率可能会影响持久内存硬件的服务质量,所以我们可以选择上一次ARS的结果,有时候也叫作快速ARS。
操作系统可以对有问题的持久内存不作映射,也可以标记成不可用空间,这样可以预防应用程序因为访问有问题的持久内存地址而崩溃。
为什么需要ARS?其原因如下。
● 巡检不会检查已经被标记成毒药的地址,但ARS可以有效地获取所有有问题的地址;
● 如果操作系统不清楚有问题的地址,应用程序一旦被分配到有不可纠正错误的持久化内存地址空间,读操作就会触发硬件错误异常,轻则应用程序崩溃,重则操作系统崩溃;
● 如果操作系统不清楚有问题的地址,在系统重启以后,操作系统很可能因为不可纠正错误而不停重启。
ARS只有在AD模式下才会生效。ARS可以在系统启动的时候自动启动,也可以在系统运行的时候手动启动。
系统发生不可恢复错误时,会采取多种措施减少错误的进一步扩散。
大部分系统依赖毒药机制确保错误数据的抑制,坏数据包被标记成毒药并抑制其继续传输。操作系统可以选择终止可能使用错误数据的应用程序或虚拟机,来减少其扩散的机会。
对于毒药机制不能抑制的致命错误,为了延缓宕机增加可用性,系统可以选择更高级别的平台级错误抑制机制——病毒(viral)。启用病毒机制后,当发生致命错误时,病毒标志会扩散到UPI和PCIe接口。系统会在UPI数据包报头里设置病毒标志,并且把病毒状态扩散到其他的CPU。PCIe接口也进入病毒状态,此时所有PCIe设备的对内对外传输都会被丢弃。这样可以防止错误数据写入非易失性的存储设备或远程的网络设备。
持久内存也支持病毒机制,当持久内存控制器检测到病毒标志后:
● 在AD模式下,持久内存的写操作会被丢弃,读操作不受影响;
● 内存模式的写操作不受影响。
病毒模式的退出:系统重启会清除病毒模式。
错误报告包括错误记录和信号发送。从系统启动到系统运行,我们可能碰到各种错误,其中可纠正的错误由持久内存控制器来处理,不会上传给主机。
如下几种不可纠正错误会被报告和记录:
● AD模式和内存模式下的数据事务错误;
● 持久内存控制器内部错误;
● 系统初始化和引导过程中的错误;
● 链路错误。
当系统发生可纠正错误或不可纠正错误时,必须把错误的信息发给用户。这是服务器设计厂商必须支持的功能,只有这样用户才能根据错误的性质决定采取何种措施,如替换有问题的DRAM或持久内存。为了实现正确的故障隔离,错误记录对于服务器系统设计有如下几个要求:
● 系统必须支持BIOS和BMC的RAS功能;
● 系统必须能区分设备错误和链路错误;
● 系统必须能区分出错的内存位置地址;
● 系统即使热启动也必须保证错误记录不丢失。
当系统检测到不可纠正错误时,错误的系统地址会被记录在微处理器的寄存器里,BIOS会进行下面的处理:
● 映射系统地址到现场可更换单元;
● 如果现场可更换单元是持久内存,BIOS会查询持久内存的介质记录,寻找不可纠正错误。如果找到记录,BIOS会尝试把系统物理地址映射到持久内存的物理地址。
服务器设计厂商需要测试RAS处理的能力,所以需要一个健壮的错误注入机制。持久内存同时支持DRAM的错误注入机制和持久内存的错误注入机制。DRAM的错误注入机制是由内存控制器来实现的,而持久内存的错误注入机制是由持久内存控制器来实现的,因为可纠正错误不会被上传给操作系统,所以错误注入机制只支持不可纠正错误的注入。
下面是几种错误注入的方法。
CScripts(Customer Scripts)是英特尔为帮助客户进行平台调试和验证而提供的脚本集合,提供了DRAM、PCIe、UPI上的错误注入和测试,它有两种使用方式。
● 带外模式:CScripts运行在计算机主机上,和ITP工具结合在一起;
● 带内模式:CScripts运行在目标机器上,利用特殊的驱动和BIOS或硬件交互,不需要额外硬件支持。
对于持久内存来说,CScripts提供了三种错误注入方式。
● 注入内存模式下的较近内存错误来调用不同的错误流程;
● 注入持久内存链路验证链路错误;
● 注入持久内存介质验证固件的错误处理流程。
表2-6 ACPI与DSM标准接口