当前位置: 首页 > 科技观察

服务器内存故障预测居然可以做到这一点!

时间:2023-03-17 00:22:16 科技观察

作者|vivoInternetServerTeam-HaoChan随着互联网业务的快速发展,基础设施的可用性越来越受到业界的关注。内存故障故障率高、频率高、影响大,是上层业务无法接受的。本文主要介绍EDAC(ErrorDetectionAndCorrection)框架在内存预测中的应用。首先介绍了EDAC的应用背景,接着介绍了EDAC的原理,然后通过EDAC安装-配置-测试的过程详细介绍了EDAC在vivo服务器上的应用,最后总结了内存预测使用EDAC和服务器RAS(Reliability,AvailabilityandServiceability)应用前景,减少硬件故障对系统的影响。一、背景随着互联网业务的快速发展,基础设施的可用性越来越受到业界的关注。然而,硬件故障一直是一个普遍现象,硬件故障造成的损失往往是巨大的。在服务器的各种组件中,内存故障是继硬盘故障之后第二常见的硬件故障类型。并且服务器内存量很大,vivo内存数达到了40万+。内存故障最严重的后果是会直接导致系统崩溃和服务器宕机。这些对于上层业务来说是不能接受的。内存故障分为UCE(UncorrectableError)和CE(CorrectableError)。当硬件检测到错误时,通过两种方式报告给CPU。其中一种方法是中断。如果这种情况是UCE,即不可纠正的错误,可能会导致服务器立即宕机。如果是CE,可以纠正错误,硬件会使用部分资源修复错误。当内存CE积累过多,无法自我修复时,就会产生UCE,导致系统关机重启。因此,我们需要尽早发现过多的CE内存条,及时更换,以免造成重大损失。以往,内存故障的发现和定位大多是通过BMC记录的MCE(MachineCheckException)日志和SEL(SystemErrorLog)日志相结合。但是最大的问题是内存问题无法提前检测到,经常会出现服务器宕机重启的情况。后来是被动发现的。此外,还存在以下几个方面的问题:难以直接在MCE日志中定位到故障内存槽。没有直观的C??E/UCE错误计数。不能根据内存条上CE/UCE的数量来判断内存的健康状态。针对以上问题,我们需要寻找其他的解决方案。这时,EDAC出现在了我们的视野中。可完美解决上述所有问题,并可实现内存CE故障主动发现,提前发现内存问题。本文将主要介绍EDAC的原理以及如何通过它实现故障预测。2.EDAC原理介绍EDAC(ErrorDetectionAndCorrection)是Linux系统的错误检测和纠正框架。其目的是在Linux系统运行过程中出现错误时检测并报告硬件错误。EDAC由一个核心(edac_core.ko)和多个内存控制器驱动模块组成。其子系统包括edac_mc、edac_device和PCI总线扫描,负责收集内存控制器和其他控制器(如L3Cache控制器)。以及PCI设备报告的错误。这里主要描述EDAC子系统edac_mc是如何收集内存控制器错误的。MemoryCE和UCE是edac_mc类获取的主要错误类型。主要涉及以下函数:[edac_mc_alloc()]:使用结构体mem_ctl_info来描述内存控制器。只有EDAC的内核可以访问它。通过edac_mc_alloc()函数分配填充结构的内容。【edac_device_handle_ce()】:标记CE错误。【edac_device_handle_ue()】:标志UCE错误。[edac_mc_handle_error()]:向用户空间上报内存事件,其参数包括故障点和故障类型的层次结构,以及累积的相关UCE/CE错误计数统计。[edac_raw_mc_handle_error()]:向用户空间报告内存事件,但不做任何发现其位置的操作,只有当硬件错误来自BIOS时,才会直接调用edac_mc_handle_error()。那么EDAC是如何控制和报告设备故障的呢?它是如何在对应的记忆棒上定位并记录故障的呢?Linux使用sysfs文件系统来显示内核设备的层级关系,EDAC使用它来控制和报告设备故障。EDAC使用抽象的内存控制器模型将故障定位到相应的内存模块,这主要与内存在系统中的排列结构有关。每个与CPU对应的MC(memorycontroller)设备控制着一组DIMM内存模块,这些内存模块以片选行(Chip-SelectRow,csrowX)和通道(Channel,chX)的形式排列,可以系统中被使用的有多个csrows和多个channel。相关文件可以通过以下路径查看:#ls/sys/devices/system/edac/mc/mc0/csrow0/ce_countch0_ce_countch0_dimm_labelch1_ce_countch1_dimm_labeldev_typeedac_modemem_typepowersize_mbsubsystemue_countuevent部分文件使用如下:EDAC如果found硬件设备控制器上报UE事件,控制器要求UE立即关闭,然后重启系统。控制器检测到CE事件后,可以看作是对未来UCE事件的预测。我们可以通过一些屏蔽的方式或者更换内存条来降低UE事件和系统宕机的可能性。三、EDAC的应用EDAC在vivo现网的应用过程主要分为以下几个步骤:(1)Linux系统对EDAC的支持EDAC在Linux2.6.16及以上版本的内核和系统中已经得到支持release版本,但是内核中有很多edac驱动模块,不同的系统版本支持的驱动模块也不尽相同。您可以通过以下方式查看系统支持哪些驱动模块。#ls/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/edac/amd64_edac_mod.ko.xzedac_core.ko.xzi3000_edac.ko.xzi5000_edac.ko.xzi5400_edac.ko.xzi7core_edac。ko.xz即.e31200_edac.ko.xz.xz那么这些驱动模块有什么区别呢?我们应该如何选择?以sb_edac和skx_edac为例,我们先看看它们的描述。#modinfosb_edacfilename:/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/edac/sb_edac.ko.xzdescription:MCDriverforIntelSandyBridgeandIvyBridgememorycontrollers-Ver:1.1.1...#modinfoskx_edacfilename:/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/edac/skx_edac.ko.xzdescription:MCDriverforIntelSkylakeserverprocessors...通过查看描述,我们发现原驱动模块与CPU的产品架构有关,安装不匹配的模块时会出现edac-util:Error:Nomemorycontrollerdatafound等错误。经过我们的测试发现,一般来说,如果CPU产品架构支持的驱动模块存在,系统会默认安装支持的驱动。(2)配置内存槽和物理槽的对应关系通过sysfs文件系统,我们可以看到哪个CPU的哪个内存的CE计数,哪个内存在哪个通道的控制下,但是它对应的是系统下的哪个内存to,毕竟在我们服务器的日常运维中,经常会看到系统槽的名字,那么它们之间到底是什么关系呢?查看edac-util的源码结构,发现其提供了配置文件labels.db,用于存储系统槽位与服务器内存物理槽位的对应关系。#cat/etc/edac/labels.db#EDAC主板DIMM标签数据库文件。##$Id:labels.db1022008-09-2515:52:07Zgrondo$##找到供应商名称和型号名称从程序'dmidecode'#标签是从主板上的丝印中找到的。##Vendor:#Model:#