十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

服务器内存ECC纠错实战:从日志定位到SAP与MBIST场景

服务器内存ECC纠错实战:从日志定位到SAP与MBIST场景 1. 先把“ECC”这三个字母拆明白做服务器运维这些年我最怕两类日志一类是凌晨三点半的磁盘故障告警还有一类就是内存相关的“Uncorrectable ECC”事件。前者至少还能撑到有人到机房后者往往意味着系统下一秒就给你脸色看。前阵子帮着处理一台数据库服务器的故障BMC日志里赫然写着“uncorrectable ECC, DIMM_A2, count 2”配合SAP月度结账的节点整个项目组都跟着紧张起来。“ECC”这个词在不同圈子里的含义完全不同。在硬件工程师和运维人员眼里它是Error Checking and Correction即内存纠错技术在ERP项目组里它是SAP ERP Central Component是企业核心业务系统而在芯片测试领域它还经常和MBIST一起出现代表片上存储器自测逻辑对纠错码的验证能力。同一个缩写三层含义偏偏在运维排查时经常被搅在一起。这篇内容主要适合三类人一是刚接手服务器管理的系统工程师需要读懂BMC和IPMI里的内存日志二是企业应用运维尤其是SAP ECC这类重业务的系统每年年结前总要做一轮硬件排查三是做嵌入式或芯片相关的工程师想搞清楚MBIST ECC到底是干嘛的。我尽量用实际经历里的场景把这几个方向串起来讲。2. ECC纠错到底是怎么工作的2.1 从奇偶校验到汉明码理解ECC之前得先理解一个更基础的东西奇偶校验。它在一个字节后面附加一个bit用来说明前面八个bit里“1”的个数是奇数还是偶数。读数据的时候重新算一遍对不上就说明出错了。问题在于它只能发现错误不知道怎么改而且对偶数个bit翻转完全无能为力。ECC用的思路更高级核心是汉明码。这东西听着玄乎打个比方就明白了假设你有七个快递盒排成一排想知道哪个盒子在运输途中被摔坏了最简单的办法是给每个盒子贴一张带编号的标签但这样标签本身也会损坏。汉明码采取的办法是只挑几个特定位置的盒子做“抽查”用抽查看板决定哪一位出错。现实中用的SEC-DED编码在还原能力上更强不仅能纠正单bit错误还能检测双bit错误这就是Single Error Correction, Double Error Detection的含义。在内存条上这个机制落到硬件层面就是数据位和校验位一起写入DRAM颗粒读出来的时候由内存控制器重新计算校验码和存储的校验码比对。结果分三种没有错误、出现了一个可纠正错误、出现了不可纠正错误。前两种系统都能自己处理第三种就直接触发中断严重的话会宕机。2.2 多一个bit的代价带ECC的内存一定比普通内存贵原因就在于多出来的那部分颗粒。标准的64bit数据总线配上ECC之后会变成72bit多出来的8bit就是给校验码用的。以DDR4 RDIMM为例一条16GB的ECC内存会使用18颗8Gb的颗粒普通内存只用16颗存储成本直接上升百分之十以上这还只是颗粒费用信号完整性设计、布线复杂度的成本另算。代价不是白付的。在常见的x86服务器场景里运行一年的内存出现单bit翻转的概率并不低尤其是高负载、高温、高海拔环境。气流散热差的机房、超频跑业务的内存出错的概率还会更大。没有ECC的内存遇到这种错误程序可能直接崩溃数据写坏有ECC的内存控制器默默纠正日志里记一条CE事件系统该跑还是跑。这个差距对个人电脑来说可能无所谓对数据库和ERP系统就是天壤之别。2.3 可纠正与不可纠正一个要处理一个要救命关于内存事件日志里有几个缩写经常出现CECorrectable Error、UEUncorrectable Error、PFAPredictive Failure Analysis。很多人看到CE就觉得无所谓实际上CE是预警信号当某个内存槽位在一段时间内反复出现CE内存控制器会把它标记为“正在劣化”这就是PFA逻辑在做的事情。系统不会立刻死掉但如果放任不管CE很可能会演变成UE。UE出现时事情就麻烦多了。单bit错误控制器能自己搞定双bit错误发现之后数据已经无法信任系统只能终止相关的执行流。表现可能是某个进程被kill掉也可能是整台服务器直接panic。更尴尬的是UE并不一定是物理内存损坏电压波动、总线信号干扰、固件bug都可能导致UE事件这也是为什么排查UE不能一上来就换内存条。3. 当ERP系统撞上ECCSAP ECC与年结实战3.1 SAP ECC里的“ECC”是另一回事在很多企业应用部门那里“ECC”后面通常会跟着“年结”两个字。SAP ECC是SAP的ERP Central Component承载着财务、物料、生产、销售等核心模块。SAP ECC的数据库和应用程序服务器对内存的需求非常大尤其是财务月结和年结期间大量报表要重算、凭证要过账、数据要汇总内存占用经常冲到峰值。我参与过好几次SAP系统年结前的保障工作说实话年结那几天最怕的不是应用逻辑出问题而是底层硬件在关键时刻掉链子。SAP的进程对内存极其敏感一个UE事件可能导致事务回滚严重的时候整个实例就停了。而年结期间业务不能中断只能紧急切换。越是这种紧张时刻底层那些平时不起眼的ECC日志越值得提前盯。3.2 年结那几天最考验底层硬件前年帮一家制造企业做年度结算保障他们的SAP ECC跑在一台老款的机架式服务器上已经服役了五年多。年结前一天晚上巡检时我在BMC的管理界面里看到一条严重告警Uncorrectable ECC内存槽位是A2错误计数显示2。当时第一反应是看内存事件的时间戳。如果这个UE是刚刚发生的那说明A2槽位很可能正在劣化第二天年结跑大事务时风险极高。因为这个系统是没有集群的只有单机运行一旦宕机SAP实例直接不可用。更麻烦的是这台机器是三个月前刚换过一轮内存A2位置插的还是新条。这时候如果盲目换内存反而可能因为没找到根因而白折腾一场。后来又翻了几层日志发现一个细节A2槽位的UE事件发生在一次意外的电压波动之后。机房的空调在那一时段刚好轮换制冷模式电网出现了很短暂的抖动。内存控制器把所有异常都记到了物理槽位上但这个槽位本身不一定坏了。3.3 “Uncorrectable ECC 显示2”到底意味着什么很多人第一次看到“uncorr. ECC 显示2”这种日志时首先想到的是“有两条内存坏了”。其实不是。这个数字在不同品牌服务器上的含义有差异但在我处理的这个案例里它代表的是错误计数器累加了2次也就是发生了两次不可纠正的内存错误事件。两次事件一次在凌晨3点12分一次在3点15分间隔很规律。顺着时间往前翻能看到那段时间系统的内存访问量并不大这反而说明硬件层面的嫌疑更大。内存地址日志显示两次错误都集中在同一个4KB页面附近这就指向了同一颗DRAM颗粒的可能性非常高。SAP年结期间高负载只是导火索真正的原因还是A2槽位对应的内存在物理上已经不稳定了。这种情况下趁结算开始前切换是唯一稳妥的方案。我们之后的做法是先把SAP实例平移到另一台备用服务器再对A2槽位做完整的压力测试确认是颗粒问题后直接换掉整条内存。那次年结最终顺利跑完之后A2槽位再没有出现过新事件。4. 排查Uncorrectable ECC的完整流程4.1 先分清消息来源排查ECC问题第一步是搞清楚消息是哪里报出来的这一步很多人会忽略导致误判。常见来源有这么几类BMC/IPMI的SEL日志服务器管理芯片记录的系统事件操作系统的EDAC驱动Linux下可以从/sys/devices/system/edac/mc/目录读取数据mcelog或rasdaemon服务记录到的Machine Check事件SAP应用层面的数据库日志进程异常退出时留下的错误记录这里有个很典型的坑操作系统里的EDAC信息并不总是和BMC里的SEL一一对应。BMC记录的是物理层事件OS记录的是CPU Machine Check的结果两者时间戳可能差好几秒。对于定位问题BMC的SEL日志优先级更高因为它能直接定位到物理槽位和内存通道。如果BMC里什么都没记录但OS里频繁报Machine Check那问题可能出在CPU或总线上而不是内存条。4.2 定位到具体内存槽位定位内存槽位需要用到服务器管理工具。戴尔的服务器可以用racadm命令惠普可以用hplog联想的用ipmitool通用做法是通过IPMI标准接口查询SEL。# 查看SEL日志 ipmitool sel list # 查看最近的错误事件 ipmitool sel elist last 20 # 查看传感器读数中的内存电压 ipmitool sdr list | grep -i mem日志里通常会带一个关键字段比如DIMM_A2。A代表内存通道2代表该通道上的第几个槽位。拿到槽位信息后配合物理布局图就能精确到具体的插槽位置。这里有一个经验不要只处理报错的那一条最好把同一个通道上的其他内存条也做一次排查因为颗粒老化往往有批次效应同批次的内存条可能出现类似的隐患。要注意的是有些OEM厂商在日志里用的是“CPU0 Channel 1 DIMM 2”这种格式要把它换算成物理槽位需要参考服务器型号的维护手册。我曾经见过有人因为没换算清楚把机器上两根好内存拔下来换到备用机上结果备用机也报警了排查了半天才发现是日志解析错了。4.3 换还是不换先做这几步验证判断要不要换内存不能只看一条UE日志。我建议按下面的顺序做验证看错误计数增长趋势。如果一天以内从1涨到5甚至更多基本可以确定是硬件问题。如果是偶发的一次而且时间戳刚好对应电源波动或维护操作可以先观察。做完整的内存压力测试。常见的工具是memtest86和Linux下的stressapptest。memtest86需要在开机时用U盘引导适合停机维护窗口。stressapptest可以在系统运行时执行更灵活一些。# 用stressapptest跑30分钟逐步加压 stressapptest -M 64 -s 1800 -i 2 -C 2对报错槽位做插拔和清洁。很多时候UE是接触不良导致的金手指氧化、插槽积灰都可能引发连续错误。重新插拔内存条并清理金手指之后错误可能就消失了。检查内存配置是否合规。不同规格混插或者频率降不下去都可能导致信号完整性变差从而出现偶发ECC事件。可以尝试把问题槽位的内存和另一条已知良好的内存互换位置再观察日志判断是槽位坏了还是内存条坏了。我给客户做排查时习惯在BIOS里开启错误重试机制并设置内存自修复选项。大部分厂商的BIOS都提供类似“Memory Error Retry”和“Post Package Repair”的选项。前者让系统在遇到可纠正错误时自动重试一次内存操作后者允许内存控制器在启动时自动关闭有问题的DRAM块。这两个功能都建议在内存隐患明确但暂时无法更换硬件的应急场景下开启。5. MBIST ECC被大多数人忽略的“体检医生”聊ECC不少人会把注意力放在操作系统和BMC日志上忘了底层还有一个MBIST。MBIST全称是Memory Built-In Self Test也就是存储器内建自测试电路。它被集成在芯片内部用于在上电或诊断模式下对内存阵列进行读写测试。MBIST和ECC是配套出现的。现代CPU、GPU、SoC的内置SRAM、Cache和寄存器堆规模越来越大靠外部测试设备根本无法覆盖于是芯片内部设计了BIST电路能够以极高的速率对存储单元做全地址全数据模式的扫描。MBIST ECC指的是这组自测试逻辑专门验证ECC功能本身是否正常能否正确写入并恢复校验位能否识别出单bit错误并纠正能否识别双bit错误并上报。有些运维朋友对MBIST不熟悉我举一个实际例子。某次排查一台存储节点反复出现可纠正ECC事件BMC和系统日志都没显示出明显的规律性。后来从底层管理工具里手动触发了一次存储控制器的MBIST测试测试报告直接指出某个Cache Bank内的ECC校验逻辑异常。这种问题靠换内存条是解决不了的必须走控制器固件升级甚至换硬件而如果不跑MBIST这种故障会让你排查到怀疑人生。对于做服务器运维的人来说MBIST不一定需要深入理解寄存器级别的实现但至少要记得两件事第一服务器BMC或者阵列卡的管理界面里通常有运行内存自检的入口遇到诡异的内存问题可以跑一遍第二MBIST结果里如果出现“MBIST ECC fail”这样的字段就说明不是因为数据写坏了而是纠正数据错误的那套机制本身坏了这俩是不同层面的问题。6. 避坑经验与常见问题速查6.1 几个我踩过的坑第一个坑可纠正ECC事件不及时处理。我见过不少新手运维觉得“可纠正错误没关系系统都没感知”于是把SEL日志里的CE事件当成噪音。实际上连续且频繁的CE事件是内存颗粒劣化最明确的信号。在我的经验里当一个内存通道在48小时内出现超过10次CE两个星期内它报出UE的概率非常高。这和时间赛跑的事情最好在CE阶段就把故障遏制住。第二个坑混插内存条引发的“假ECC错误”。现在的服务器对内存规格要求很严格不同厂牌、不同频率、不同单条容量混插会影响信号完整性即使都是带ECC的也可能触发大量偶发CE甚至UE。我遇到过一台机器每次满负载就跑出几条CE事件查了半天结果是服务器里插了两根不同型号的RDIMM正在以降频模式运行。拔掉一根内存降频现象消失错误也随之消失。第三个坑把SAP ECC年结的压力全押在数据库服务器上却不做年结前的硬件健康检查。年结不是软件部门自己的事底层硬件的稳定性直接决定了年结能不能顺利跑完。比较稳妥的做法是年结前至少做一次完整的内存诊断、磁盘健康检查和散热状态检查同时备份好BMC的SEL日志这样万一在年结中途出了问题复盘时也有据可依。6.2 常见问题速查表现象可能原因优先处理方式单条内存频繁CE事件颗粒老化或接触不良清洁金手指并重新插拔继续观察UE事件但系统未宕机存在错误重试机制确认重试是否生效尽快安排更换UE事件后系统panic内存数据不可信定位槽位做压力测试确认后更换CE和UE计数同时增长同一条内存正在劣化立即计划停机窗口换内存不同槽位交替出现CE电源或主板问题嫌疑大检查电源余量、主板电容和供电线路报错槽位和实际物理槽位对不上日志解析错误查服务器手册重新定位MBIST结果显示ECC逻辑失败控制器芯片内部问题联系厂商固件升级或更换控制卡系统负载高时内存报错加剧电压波动或散热不良检查散热和电源质量再考虑内存条故障6.3 最后再分享一个小技巧在ECC问题的排查上我个人的习惯是双线并行一边看BMC硬件的SEL日志一边在操作系统里用EDAC和mcelog采集系统层面的错误。两边时间戳对照能很快判断出事件到底发生在物理层还是逻辑层。如果你用的是Linux建议启用rasdaemon服务它能把Machine Check Exception翻译成人话省去很多阅读十六进制错误码的时间。遇到“Uncorrectable ECC 显示2”这种日志不用慌张先回答三个问题事件发生在什么时间集中在哪个槽位计数是否在持续增长搞清楚这三件事八成的问题都能定位到具体方向。做运维这行不怕报错怕的是报错之后不知道从哪里下手。ECC日志是硬件给你的提前预警尽早读懂它就能在真正的灾难到来之前把损失降到最小。
返回列表