一块加速卡的剖面示意,主计算区安静地排成方阵,边缘一小列独立小芯片各自连出一根细线,汇到右侧一块带刻度的采集面板

一、这批核做的是哪一类工作

据公开报道,有厂商曾披露其图形处理器产品里用了一批开源指令集核心,数量级达到十亿以上;这些核心不用于图形渲染,而是充当微控制器执行各类辅助任务,按型号不同,每颗卡里有十个到四十个不等,而在这之前使用的是私有微控制器方案。这些数字不是我们测出来的,也不构成本文判断的依据。真正值得在意的是那件事本身:卡上有一层独立于主计算逻辑的控制面,它一直在运行。

这批核承担的是与管理面相关的辅助任务,大致可以归到五类:上电与初始化序列、时钟与功耗管理、错误上报与看门狗、固件加载与校验、带外的状态采集。五类的共同点是它们都不参与计算,却决定了计算能不能被安全地启动、约束和观察。

为什么这些活要交给独立的核,而不是主逻辑顺手做?理由很实在:主逻辑在被高压运行的时候,恰恰是最不能响应管理请求的时刻。而最需要看这块卡状态的时刻,正是它最忙、最可疑的时刻。把采集与上报放在独立的执行单元上,等于给管理面留了一条不受负载影响的通路。带外之所以有用,也在这个“带外”上:主链路挂了,管理链路还在。

二、对集群运维的直接影响

这一层存在与否,直接影响故障定位能做到多细。

没有片上控制面时,多数故障只能停在“作业失败”这一级:任务挂了、驱动报错了、节点被隔离了,再往下就说不清。有这一层并且信号能被采出来、带上可信时间戳时,定位可以细分到某一层的某类事件——是初始化阶段没过去,是功耗被压下来导致的性能塌陷,还是错误恢复动作在中途触发过。

这里的前提要说清:能被采出来。事件存在和事件能被运维系统拿到,是两件完全不同的事,很多团队把前者当成后者,于是监控面板上永远只有利用率。时间戳的可信度也是前提之一:不同卡的时间基准如果不统一,跨卡事件的先后关系就排不出来,而排不出先后的事件流,归因价值会掉一大半。

三、三个必须核实的点,以及采购侧要多问的两件事

选型或接入之前,三个点必须落到实测,不接受文档说法。

第一,采集接口是不是公开的。公开的意思是:能自己读、能持续读、不需要厂商侧人工配合,且字段含义有成文说明。只给一个诊断工具、跑一次出一份静态报告的,不算可运维接口。

第二,这些事件的粒度与频率能不能被调度层利用。秒级汇总的功耗数据和逐事件的错误流,用途完全不同。调度层要的是能触发隔离动作的粒度与延迟,如果事件只能以长周期累计值形式给出,那它在调度侧几乎没有用,只能进报表。

第三,控制核自身异常时有没有二级上报。这是个容易漏的层次:负责上报的那部分如果静默了,系统看上去就变成“这块卡一切正常”。要确认主链路能否察觉控制面失联,并把“控制面无数据”本身当成一种告警状态,而不是当成采集故障忽略掉。

管理面从私有方案换成公开指令集之后,采购侧还要多问两件事。一是生态兼容性不等于可运维性:能被主流框架跑起来,和能被自家监控读清楚,是两个独立问题,前者通过不代表后者可行。二是管理面的开放程度直接决定能不能自建监控:如果关键事件只能通过封闭通道取,最后只能接受别人的面板口径,出了事故也无从复核。

四、把“能不能看见这块卡”写成验收清单

验收清单要按“字段能不能拿到、口径是不是明确”来写,不要写成一句“支持带外管理”。

验收项 要通过的标准 拿不到时的归类
温度与功率曲线 有明确采样间隔,能按运维需要设置,且能区分瞬时值与窗口均值 不可观测项
错误计数 明确是累计值还是事件流,累计值要能给出上电清零规则 口径不明项
错误恢复动作 每次恢复或重试都有记录,包含触发原因与结果 不可观测项
固件版本与配置 可远程读回,能与集群清单比对,变更有历史 需人工核对项
控制面自身状态 控制面无数据或心跳丢失能作为独立状态出现 必须补齐项
时间基准 事件时间戳来源明确,跨卡可排序 口径不明项

最后一列很重要。采不到的字段要明确写进“不可观测项”清单,而不是靠经验猜、靠猜出来的指标做告警。明确写出“这一项我们看不见”,事故复盘时才不会被一句“应该有值”拖住。

五、两类常见误判,以及跨型号混跑时的分桶原则

第一类误判是把累计计数当增量用。控制核上报的错误计数多数是从某个基准点累计的,重启、上电、驱动重载都可能改变基准。直接对累计值做差当作这一段周期的新增,会在这些动作发生那天得到一个巨大的假峰值;反过来,把复位后的零值当作“没有错误”,会漏掉复位之前那段。判据很简单:任何计数型指标必须先确认清零条件,再决定能不能做差。

第二类误判是把“支持带外管理”当成“带外数据口径与自家采集器一致”。支持是一回事,字段定义、单位、聚合窗口、错误码取值范围是否对得上,是另一回事。这一类误判的典型后果是两个系统给出的数字看起来都合理,却永远合不上,最后各信各的。

跨型号混跑时最麻烦的一处也在口径上。不同型号的控制核任务划分不同,字段含义也可能不同,把两代卡的同名指标聚到一起出图,聚合出来的曲线会失去可比性,看着像整体劣化,实际只是新型号占比上升。做法是按后端分桶出图,不用总览图做判断;总览图可以留着看趋势,任何告警与结论都只在同型号桶内成立。

六、版本族一致性,以及我们给客户做监控时的落地做法

软件栈升级会牵动这一层。驱动与控制核固件要按同一版本族走,只升其中一边会出现一种很费解的状态:状态能读出来,但语义是错的——字段位置变了而名字没变、单位换了而数值范围看着正常。这类问题比读不到数据更危险,因为它会安静地给出错答案。上线纪律要写成:驱动与固件要么成对升级、成对回退,要么明确标注当前组合属于经过验证的组合清单之内;组合清单要随每次验证结果更新,不能只写版本号。

具体落地时,我们的做法固定从一次单卡事件普查开始。取一张有代表性的卡,在受控条件下把能采到的字段全部拉一遍,包括空闲、满载、被限功耗、人为触发错误恢复这几种状态,逐条记录字段名、取值范围、更新方式(瞬时、窗口、累计)、采集延迟和是否需要特权。普查做完,会自然分成三堆:能直接用的、口径要问的、拿不到的。第二堆去问接口文档和厂商支持,第三堆写进不可观测项。

三堆分完再谈告警口径。这个顺序不能反:先定阈值再做采集,最后一定是拿能采到的字段硬凑出几条规则,看着齐全,真出事时一条都命中不了。监控方案的交付物也应该是这张字段清单加上不可观测项列表,而不是只有几张图。洹拓在给算力集群做运维方案时,把这两份东西列为第一阶段唯一交付物,原因就在这里:这批核带来的不是更高的算力上限,是一层本来看不见的运行状态。能不能把这层变成可核对的字段,才是它在运维上真正的价值。