PCIe 是当前使用最广泛的硬件高速总线接口,业界主流的 GPU、网卡、存储等系统几乎都通过 PCIe 总线和 CPU 通信,因此,对于大规模数据中心来说,PCIe 的稳定性和可维护性对整个数据中心的高可靠、高可用性至关重要。Facebook 在这篇文章里介绍了在数据中心里自动化监控、修复 PCIe 错误的经验,原文链接:How Facebook deals with PCIe faults to keep our data centers running reliably
得益于传输速率的持续提升,PCIe(Peripheral component interconnect express,高速串行计算机扩展总线标准)正在不断扩展计算的边界。现在 PCIe 支持更多的并行数据传输通道,同时在主板上占用的面积也越来越小。今天,基于 PCIe 连接的硬件可以支持更快的数据传输,是将组件连接到服务器的标准方式之一。
Facebook 的数据中心包含数以百万计的基于 PCIe 的硬件组件(包括基于 ASIC 的用于视频处理和 AI 推理的加速器、GPU、网卡和 SSD)直接连接到服务器主板上的 PCI 插槽,或者连接到类似于载卡(carrier card)的 PCIe 交换机上。
和其他硬件一样,基于 PCIe 的组件也容易发生不同类型的硬件、固件或软件相关故障,也有可能出现性能下降的情况。不同的组件和供应商、大量的故障以及规模化带来的挑战,使得基于 PCIe 的组件监控、数据收集和故障隔离具有很大的挑战性。
我们开发了一套系统来检测、诊断、补救和修复这些问题。自从有了这套系统,使我们的硬件系统更可靠、更有弹性,从而获得了更高的使用效率。我们相信,整个行业都可以从这些信息、策略中受益,并帮助围绕这一常见问题建立行业标准。
Facebook 的数据中心采用了一系列基于 PCIe 的硬件组件
首先,我们简单介绍一下使用的工具:
PCIe 硬件组件(ASIC、网卡、SSD 等)的多样性使得分析 PCIe 相关问题成为一项艰巨的任务。这些组件有不同的供应商、固件版本,以及运行在上面的不同的应用程序。在此基础上,应用程序本身可能有不同的计算和存储需求、应用配置和容错需求。
通过利用上面列出的工具,我们一直在进行研究,从而解决这些挑战,并确定 PCIe 硬件故障和性能退化的根本原因。
有些问题是显而易见的。例如,即使特定服务器上只有一个实例,PCIe 的致命未修正错误也绝对会造成糟糕的后果。MachineChecker 可以检测到这一点,并标记出有问题的硬件(最终会把它替换掉)。
根据错误条件的不同,不可纠正错误进一步分为非致命错误和致命错误。非致命错误是指那些导致特定事务不可靠,但 PCIe 链接本身功能齐全的错误。而致命错误会导致链接本身不可靠。根据我们的经验,我们发现对于任何未纠正的 PCIe 错误,更换硬件组件(有时是主板)是最有效的行动。
其他问题在一开始看起来似乎无关紧要。例如,根据标准定义,PCIe-corrected 错误是可纠正的,并在实践中大多可以得到很好的纠正。可纠正的错误应该不会对接口的功能造成影响。然而,可纠正错误发生的频率很重要。如果发生频率超过了特定的阈值,就会导致某些应用程序出现不可接受的性能下降。
我们进行了深入的研究,将性能退化和系统失速与 PCIe 错误修正率关联起来。另一个挑战是确定合适的阈值,因为不同的平台和应用程序有不同的系统配置和需求。我们推出了 PCIe 错误日志服务,观察 Scuba 中的故障、关联事件、系统暂停和 PCIe 故障,以确定每个平台的阈值。我们发现,当 PCIe 错误修正率超过特定阈值时,替换硬件是最有效的解决方案。
PCIe 定义了两种错误报告模式:基线能力和 AER 能力。所有 PCIe 组件都需要基线能力,并提供最低定义的错误报告。AER 能力是通过一个 PCIe AER 扩展能力数据结构实现的,并提供更健壮的错误报告。PCIe AER 驱动程序提供了支持 PCIe AER 能力的基础设施,我们通过 PCIcrawler 来收集这些信息。
我们建议每个供应商应当采用 PCIe AER 功能和 PCIcrawler,而不是依赖自定义工具,因为供应商自定义工具缺乏通用性。自定义工具的信息很难被解析,因此更加难以维护。此外,采用自定义工具使得集成新的供应商、新的内核版本或新的硬件类型需要大量的时间和精力。
坏的(降级的)链路速度(通常是运行在预期速度的 1/2 或 1/4)和坏的(降级的)链路带宽(通常是运行在预期链路带宽的 1/2、1/4 甚至 1/8)是需要关注的另一类 PCIe 相关故障。因为硬件本身还在工作,只是没有达到的最佳状态,所以如果没有某种自动化工具,这些故障很难被检测到。
根据我们的大规模研究发现,这些故障大部分可以通过复位硬件组件来修复。这就是为什么我们在将硬件标记为故障之前首先会去尝试这种方法的原因。
由于这些故障中的一小部分可以通过重启硬件来修复,我们还记录了历史修复操作。我们有特殊的规则来识别经常出错的硬件。例如,如果同一台服务器上的相同硬件组件在预先确定的时间间隔内发生故障的次数达到预定义的阈值,经过预先确定的复位次数后,我们自动将其标记为故障并将其替换出去。如果替换组件不能解决问题,我们将不得不进一步替换主板。
我们还密切关注修复的趋势,以识别非典型故障率。例如,在一种情况下,通过使用自定义 Scuba 表的数据及其生成的可视化图表和时间线,我们找到了一个性能下降的根本原因,是由特定厂商发布的特定固件所造成的,然后我们与供应商合作推出了新的固件来修复这个问题。
同样重要的是,我们可以将补救和修复速率限制作为一个安全网,以防止代码中的 bug、配置错误等问题泄露到生产环境,如果对这些问题处理不当,有可能会导致服务中断等严重后果。
通过这个总体方案,我们已经能够覆盖硬件健康指标,并修复数千台服务器和服务器组件。我们每周都能够检测、诊断、补救和修复数百台服务器上的各种 PCIe 故障。
以下是我们识别和修复 PCIe 故障的过程分解:
我们已经能够覆盖硬件健康指标,并通过这种方式修复了数千台服务器和服务器组件。我们每周都能够检测、诊断、补救和修复数百台服务器上的各种 PCIe 故障。这使得我们的硬件更可靠、更有弹性、有更高的使用效率。
Reference: [1] https://github.com/facebook/pcicrawler [2] https://engineering.fb.com/2020/08/05/open-source/pcicrawler/ [3] https://engineering.fb.com/2020/12/09/data-center-engineering/how-facebook-keeps-its-large-scale-infrastructure-hardware-up-and-running/ [4] https://github.com/ipmitool/ [5] https://github.com/openbmc/ [6] https://engineering.fb.com/2016/07/11/production-engineering/making-facebook-self-healing-automating-proactive-rack-maintenance/ [7] https://research.fb.com/wp-content/uploads/2016/11/scuba-diving-into-data-at-facebook.pdf
领取专属 10元无门槛券
私享最新 技术干货