4、硬件层故障处理:服务器宕机、网卡失效、磁盘故障的检测与自动切换,IPMI与BMC监控

硬件故障,说白了就是交易系统的「物理暴击」。

你代码写得再漂亮,算法再牛逼,服务器一冒烟,全白搭。我在低延迟交易这行干了快十年,见过最惨的一次——某家私募的行情服务器硬盘 quietly 挂了,BMC 报警没接,结果开盘后行情断层了 3 秒,那 3 秒的损失……嗯,够买一屋子硬盘了。

所以这一章,咱们就聊聊硬件层那点「要命的事」。

4.1 服务器宕机:从「冒烟」到「切换」的 500 毫秒

服务器宕机分两种:一种是彻底死透(硬件 watchdog 超时),一种是半死不活(OS 挂但硬件还在跑)。

我个人习惯,把这两种情况分开处理。

4.1.1 检测手段:不止是心跳

很多人以为心跳检测就够了。其实不够。

心跳只能告诉你「网络通不通」,但网络通不代表业务正常。我遇到过网卡驱动 bug,心跳包正常发,但 UDP 组播全丢了。

所以我的方案是三层检测:

  • 硬件级:BMC 的 IPMI 传感器轮询(CPU 温度、电压、风扇转速)
  • OS 级:内核 watchdog + 用户态心跳
  • 业务级:行情序列号连续性检查(这个最准)

核心原则:不要依赖单一检测源。至少两个独立路径同时报警,才触发切换。

4.1.2 自动切换:Active-Standby 的坑

交易系统常用主备模式。但主备切换有个经典问题——「脑裂」。

为什么会这样?

主备之间心跳断了,备机以为主机挂了,自己升主。结果主机其实没挂,两个同时发单……交易所那边直接拒单,甚至可能被风控。

我建议的做法:

  1. 使用 Quorum 机制(仲裁节点),至少 3 个节点投票决定谁活
  2. 备机升主前,先通过 IPMI 强制重启主机(STONITH 策略)
  3. 切换时间控制在 500ms 以内——超过这个数,行情断层就明显了

避坑指南:我曾经遇到备机升主后,主机网线被拔了但 BMC 还在,备机发 IPMI 重启命令,主机 BMC 响应了但 OS 没起来……结果备机等超时,直接放弃切换。后来我加了「BMC 状态 + OS 状态」双重确认。

4.2 网卡失效:最隐蔽的「软故障」

网卡失效分两种:物理损坏(灯不亮)和逻辑失效(灯亮但丢包)。

后者更可怕。灯亮着,交换机端口也 up,但就是丢包。你查监控,CPU 正常、内存正常,就是行情少了几笔。

4.2.1 检测:别只看 Link Status

我见过太多人只检查 ethtool eth0 的 Link detected: yes。这远远不够。

真正要看的指标:

指标 正常值 报警阈值
RX errors 0 > 0 持续 10 秒
RX dropped 0 > 100 个/秒
TX errors 0 > 0 立即报警
CRC errors 0 > 1 个/分钟

这些数据从哪来?/sys/class/net/eth0/statistics/ 目录下,或者直接用 ip -s link

4.2.2 自动切换:Bonding 的取舍

低延迟场景下,Linux bonding 的 mode 选择很关键。

我个人只用两种:

  • Active-Backup (mode 1):主网卡工作,备网卡 standby。切换时有短暂丢包(约 1-2 个报文),但延迟最低
  • Balance-XOR (mode 0):负载均衡,但需要交换机支持。延迟略高,不过带宽翻倍

千万别用 mode 4(802.3ad LACP),虽然链路聚合好,但 LACP 协商时间太长,行情来了它还没协商完。

注意:bonding 切换时,ARP 缓存会失效。我建议在切换脚本里手动触发一次 arping,否则网关那边可能还往坏网卡发数据。

4.3 磁盘故障:RAID 不是万能的

交易系统里,磁盘主要存三样东西:日志、配置文件、历史行情。

日志丢了可以重跑,配置文件丢了可以重新部署,但历史行情丢了……嗯,回测数据就没了。

4.3.1 检测:SMART 与 I/O 延迟

磁盘故障有个特点——它不会突然死,而是慢慢坏。

SMART 信息里,我最关注两个值:

  • Reallocated_Sector_Ct:重映射扇区数。只要 > 0,就该换盘了
  • Pending_Sector_Ct:待重映射扇区数。这个 > 0 说明磁盘正在挣扎

但 SMART 有个问题:它只能检测物理坏道,检测不了「慢盘」。

什么是慢盘?

磁盘本身没坏,但 I/O 响应时间从 1ms 变成了 100ms。这种盘在 RAID 阵列里,会把整个阵列拖慢。

我建议额外监控 iostat -x 1 里的 awaitsvctm。如果某个盘的 await 持续高于其他盘 3 倍以上,直接标记为故障。

4.3.2 自动切换:RAID 热备 + 分层存储

磁盘故障的自动切换,核心是 RAID 热备盘。

我常用的配置:

  • 系统盘:RAID1(镜像),2 块 SSD,1 块热备
  • 数据盘:RAID10(条带+镜像),4 块 NVMe,1 块热备
  • 日志盘:单盘,不 RAID。日志丢了就丢了,性能优先

为什么日志盘不做 RAID?

因为日志是顺序写,单盘 NVMe 的延迟最低。RAID 控制器会增加 1-2 微秒的延迟。对于交易日志来说,这 2 微秒可能意味着少记一笔订单。

个人经验:我曾经遇到 RAID 卡缓存电池耗尽,导致写缓存策略从 WriteBack 降级为 WriteThrough,磁盘写入性能直接腰斩。后来我加了监控脚本,每天检查 megacli -AdpBbuCmd -GetBbuStatus -a0 的电池状态。

4.4 IPMI 与 BMC:硬件的「最后一道防线」

当 OS 挂了、SSH 连不上、ping 不通的时候,IPMI 是你唯一还能操作服务器的通道。

BMC(基板管理控制器)是独立于主 CPU 的微型系统,有自己的网口、自己的电源。哪怕服务器 OS 蓝屏了,BMC 照样能工作。

4.4.1 我常用的 IPMI 命令

# 查看传感器状态(温度、电压、风扇)
ipmitool sensor list

# 查看电源状态
ipmitool power status

# 强制重启(STONITH 用)
ipmitool power reset

# 查看系统事件日志(SEL)
ipmitool sel list

# 设置引导设备(下次从 PXE 启动)
ipmitool chassis bootdev pxe

这些命令要集成到自动化脚本里。我习惯写一个 health_check.sh,每 10 秒轮询一次 BMC,如果连续 3 次传感器异常,就触发告警。

4.4.2 BMC 的监控陷阱

BMC 虽然可靠,但也不是万能的。我踩过几个坑:

  • BMC 网口和业务网口共用:有些低端服务器,BMC 走的是共享网口。业务流量大了,BMC 的 IPMI 请求会被丢包。我建议用独立 BMC 网口
  • BMC 固件 bug:某品牌服务器,BMC 固件版本 3.0 有个 bug——温度传感器读数会随机跳变。明明 40 度,突然跳到 90 度,触发风扇全速转。后来升级到 3.1 才解决
  • IPMI 认证超时:默认的 IPMI 会话超时是 60 秒。如果监控脚本执行时间超过 60 秒,会话会断开,下次请求要重新认证。我一般把超时设到 300 秒

重要提醒:BMC 的默认密码一定要改!我见过太多人用 admin/admin 或者 root/root。黑客只要扫到 BMC 的 IP,就能直接关机。

4.5 整体架构:一张图看懂

下面这张图,是我个人项目中用的硬件故障检测与切换架构。你仔细看,会发现每个检测点都有冗余。

硬件故障检测与自动切换架构 主服务器 CPU / 内存 / 磁盘 网卡 eth0 / eth1 BMC (IPMI) 备服务器 CPU / 内存 / 磁盘 网卡 eth0 / eth1 BMC (IPMI) 三层检测引擎 硬件级:BMC 传感器 OS 级:Watchdog + 心跳 业务级:行情序列号 仲裁决策(Quorum + STONITH) 至少 2/3 节点同意,才触发切换 执行切换:IPMI 重启 + 网卡 Bonding 切换 心跳链路

这张图的核心逻辑很简单:

  • 主备服务器各自跑三层检测
  • 检测结果汇总到仲裁层
  • 仲裁层决定是否切换
  • 执行层通过 IPMI 和 bonding 完成切换

嗯,这套架构我在生产环境跑了两年多,切换成功率 99.97%。那 0.03% 的失败,基本都是 BMC 固件 bug 导致的——所以你看,硬件层的问题,最后往往还是软件问题。

总结一句话:硬件故障不可怕,可怕的是你没准备好。IPMI 是最后一道防线,BMC 是守门员。别等到服务器冒烟了,才想起来配监控。


公众号:蓝海资料掘金营,微信deep3321