随着互联网业务的快速发展,基础设施的可用性也越来越受到业界的关注。内存发生故障的故障率高、频次多、影响大,这些对于上层业务而言都是不能接受的。
本文主要介绍EDAC(Error Detection And Correction)框架在内存预测方面的应用。首先介绍了EDAC应用的背景,接着是EDAC的原理介绍,然后通过EDAC安装——配置——测试过程详细地介绍了EDAC在vivo服务器上的应用,最后提出了内存预测使用EDAC的方案总结以及服务器RAS(Reliability, Availability and Serviceability)应用减小硬件故障对系统的影响的展望。
一、背景介绍
随着互联网业务的快速发展,基础设施的可用性也越来越受到业界的关注。然而硬件故障一直以来都是一种普遍存在的现象,由于硬件故障而造成的损失往往是巨大的。在服务器各个部件中,除硬盘故障以外,内存故障是第二大常见的硬件故障类型。并且服务器内存的数量众多,vivo的内存数量达到40w+条,内存故障造成的最严重的后果是会直接导致系统崩溃,服务器宕机,这些对于上层业务而言都是不能接受的。
内存故障可分为UCE(Uncorrectable Error)和CE(Correctable Error)。当硬件侦测到一个错误,它会通过两种方式报告给CPU的。其中一种方式是中断,这种情况如果是UCE也就是不可纠正错误,则可能会导致服务器立马宕机。如果是CE,即可纠正错误,硬件会利用一部分资源对该错误进行修复,而当内存CE累计过多,无法进行自我修复时,则会产生UCE,造成系统宕机重启。因此,我们需要尽早地发现CE过多的内存条,及时进行更换,避免造成重大的损失。
以往内存故障大多是通过MCE(Machine Check Exception)log 和BMC记录的SEL (System Error Log)日志结合去发现定位故障的,而这些最大的问题是不能够提前发现内存问题,往往是服务器宕机重启后才被动发现的。除此之外还存在以下几个方面的问题:
-
MCE日志很难直接定位到故障内存槽位。
-
没有直观的CE/UCE错误计数。
-
无法根据内存条上CE/UCE的数量判断内存的健康状况。
针对以上问题,我们需要寻找别的解决方案。这时EDAC便出现在我们的视野,它能够完美地解决上面所说的所有问题,并且能够实现内存CE故障的主动发现,提前发现内存问题。
本文将主要介绍EDAC的原理以及如何通过它实现的故障预测。
二、EDAC 原理介绍
EDAC(Error Detection And Correction)是Linux系统的错误检测和纠正的框架,它的目的是在linux系统运行过程中,当错误发生时能够发现并且报告出硬件错误。EDAC由一个核心(edac_core.ko)和多个内存控制器驱动模块组成,它的子系统有edac_mc、edac_device、PCI bus scanning,分别是负责收集内存控制器,其他控制器(比如L3 Cache控制器)以及PCI设备所报告的错误。
这里主要讲述EDAC子系统edac_mc是如何收集内存控制器的错误。内存CE以及UCE是edac_mc class获取的主要错误类型,它主要涉及了以下几个函数:
- 【edac_mc_alloc()】 :使用结构体mem_ctl_info来描述内存控制器,只有EDAC的核心才能接触到它,通过