服务器专题 | 第16期:把故障关进一个端口

服务器 · · 九羲科技

一台跑了半年的服务器,某天凌晨一块 NVMe 盘开始报错。最坏的结果不是丢一块盘,而是报错像水一样漫开:错误数据被继续往上传,别的盘、网卡、应用都跟着读到脏数据,整机只能靠重启收场。PCIe 规范里对付这种漫开,有一套分工很清楚的组合:高级错误报告(AER)负责把错误记下来、分好级,下行端口遏制(DPC)负责在出事的端口关门,功能级复位(FLR)负责把单个功能逐个复位。三件事各管一段,合起来才叫隔离。

先说记账。AER 把错误分成可纠正与不可纠正两大类,再往下分严重度。Linux 内核的 AER 文档写得很实在:可纠正错误只作为警告输出,硬件自己纠过来,系统继续跑;不可纠正则作为错误输出,软件必须介入1。这个分级不是为了好看,而是决定后面动不动手。可纠正错误偶尔出现,是链路在正常工作;同一种可纠正错误持续刷屏,计数一直在涨,那是链路在勉强维持,迟早要出大事。记账的意义就在这里:不是等到致命错误才反应,而是在计数曲线爬升时就看到趋势。

出事的端口,先关门再查案

DPC 是这套组合里最硬的一环。它是下行端口的可选特性:当端口下方出现未被屏蔽的不可纠正错误,DPC 自动把该下行端口以下的链路停掉2。停掉的意思很具体:错误数据不再往上传,也不再往下传,故障被关进一个端口里。关门之后,操作系统收到通知,再决定是复位设备、重新枚举,还是把业务切走。顺序不能反:先查案再关门,脏数据可能已经扩散;先关门再查案,损失被锁在一个范围里。

DPC 的动作:故障设备的下行端口阻断链路,错误不再向上扩散,其余设备继续工作,恢复时再逐个复位(示意图为程序绘制)

但 DPC 有两个边界,买之前要问清楚。第一,它是可选特性,不是所有端口都有,规范里写明由 DPC 扩展能力结构标明支持与否2。第二,端口支持不等于平台全程支持:戴尔的白皮书提醒,DPC 能否真正用于恢复,取决于操作系统与 BIOS 是否都支持3;同一份材料还写到,某些虚拟化平台在 Switch 挂接的端口上不支持 DPC3。也就是说,隔离能力是一条链:芯片、固件、操作系统,缺一环,关门动作就可能落不了地。验收时不能只看芯片手册上印着 DPC,要看整条链在自己的平台上实测走通过没有。

错误分三档,复位只动一个功能

错误分级往下走,还有一层更细的切法。可纠正错误,硬件纠错后继续;不可纠正但非致命,软件介入处理,设备未必立刻下线;不可纠正且致命,触发 DPC 关门。这一档一档的台阶,决定了处理动作的烈度:能轻手轻脚,就别大动干戈。把所有错误都当成致命处理,机器会频繁停摆;把致命错误当成普通警告,脏数据会漫开。分级就是为了让动作的烈度配得上错误的严重度。

AER 的错误分级:可纠正只记一笔,非致命上报软件处理,致命触发 DPC 关门。动作烈度跟着严重度走(示意图为程序绘制)

复位这一环,FLR 把粒度收到了最小。传统复位动的是整条链路、整个设备,FLR 只复位一个功能:向目标功能的设备控制寄存器写复位位,该功能要在 100 毫秒内完成复位4。一个多功能设备上,一个功能出问题,FLR 可以只动它,不动旁边的功能。虚拟化场景里这点尤其值钱:直通给不同虚拟机的功能,本来就该各管各的生死。复位粒度越小,故障的 blast radius 越小,恢复时需要重建的状态也越少。

落到买方清单,这套隔离机制可以收成四问。第一问,关键端口是否支持 DPC,芯片手册之外,固件与操作系统组合是否实测走通过。第二问,AER 计数平时有没有人看,可纠正错误的爬升曲线是不是已经进了巡检。第三问,多功能设备是否支持 FLR,复位粒度是不是真能做到只动一个功能。第四问,热插拔流程里,拔盘、换盘、重枚举这一串动作,有没有在 DPC 与 FLR 的配合下实际演练过。隔离不是买来的特性,是演练过的流程。

以小见大的一层判断:可靠性从来不是“不出错”,而是“出错时损失有多大”。一台机器真正的健壮程度,不看它多久不出事,而看它出事时能不能把损失关在一个端口、一个功能里。AER、DPC、FLR 这三个名字背后,是同一种工程态度:承认错误一定会来,提前把门、把锁、把钥匙都准备好。

没完全想通、留下一个问题:DPC 关门之后,业务切走与设备复位的先后顺序,在不同操作系统与虚拟化平台上做法并不统一。关门越快,数据越干净,但恢复路径也越依赖平台配合。这条恢复路径的标准做法,公开资料里谈得还不够细,值得对照实测再写。

觉 然 小 注

好系统不怕出错,怕的是出错没处关门。门在,损失就有边。

· · ·

九羲科技|服务器 · 私有 AI · 存力方案

系列目录
第1期 | 73% 的整机钱,都给了 GPU 板组
第2期 | 4500 颗芯片撑起 95% 的机架价值
第3期 | 拆一台 2U 双路:通用服务器的钱花在哪
第4期 | 大铁盒子,值钱的不是铁
第5期 | 冻结点:L5 之后结构不许再改
第6期 | 能点亮不等于能交付:十二层验什么
第7期 | 内存离 CPU 有多远:NUMA 的延迟税
第8期 | 带宽不是买速度,是买并行度
第9期 | 一颗坏芯片,怎样不拖垮整机
第10期 | 数据上台三步,每步都在花时间
第11期 | CXL 内存慢一档,为什么还值得买
第12期 | 存力只在关键路径上才算数
第13期 | 链路是谈出来的:开机几秒谈什么
第14期 | 四电平挤带宽:SerDes在替谁赎买
第15期 | 端口数好看,带宽要看上行

引用与出处
[1] Linux 内核文档. PCI Express Advanced Error Reporting Driver Guide. kernel.org. https://www.kernel.org/doc/html/next/PCI/pcieaer-howto.html
[2] PCI-SIG. Downstream Port Containment, Engineering Change Notice ECN_DPC_2012-02-09_finalized, 第 6.2.10 节, 2012(无公开直链,定义要点与 [3] 戴尔白皮书一致)。
[3] Dell EMC. NVMe Hot-Plug and error handling on Dell EMC PowerEdge servers running VMware vSphere or vSAN(技术白皮书). dl.dell.com. https://dl.dell.com/content/manual7418987-nvme-hot-plug-and-error-handling-on-dell-emc-poweredge-servers-running-vmware-vsphere-or-vsan.pdf
[4] AMD. Resets(PG213,含 Function-Level Reset 100ms 要求). docs.amd.com. https://docs.amd.com/r/en-US/pg213-pcie4-ultrascale-plus/Resets

下一篇|第17期:PCIe 管 IO,CXL 管一致性 —— 设备能缓存主机内存之后,变了什么。

← 返回资讯中心