平台架构
HeteroFlow 是本站的异构算力与大模型调度产品。平台架构。平台架构 硬件验证边界(截至 2026-10-20) :本文中的“10 种品牌/检测器”指代码检测与适配范围,不代表 10 种硬件都完成了真机端到端验证。现有项目记录显示 NVIDIA 多机型已有真机端到端证据;国产加速卡检测逻辑已做软件及厂商命令输出对照,真机端到端验证仍待对应…
平台架构
> 硬件验证边界(截至 2026-10-20):本文中的“10 种品牌/检测器”指代码检测与适配范围,不代表 10 种硬件都完成了真机端到端验证。现有项目记录显示 NVIDIA 多机型已有真机端到端证据;国产加速卡检测逻辑已做软件及厂商命令输出对照,真机端到端验证仍待对应硬件。
HeteroFlow v2 是面向异构 GPU 算力池的裸金属调度平台,整体形态是一台控制面 + N 个 Agent 节点 + 一个 PostgreSQL:控制面是一个 Go 单体二进制(端口 3333),聚合 API、调度、网关、告警等全部服务;每台 GPU 节点运行一个轻量 Agent 守护进程,以纯出站轮询方式与控制面通信;持久化只依赖 PostgreSQL 一件事。刻意不上 Kubernetes——裸金属形态让调度器直接面对 GPU 硬件事实(型号、显存、拓扑、分片能力),不需要经过 Device Plugin 与 K8S 调度语义的翻译层,单集群内完成检测、调度、分片、推理网关与用量核算闭环。
总体分层架构
┌──────────────────────────────────────────────────────────────────────┐
│ 前端 SPA(React 19 + TypeScript + Vite,28 个路由,静态托管 5173) │
│ 仪表盘 · 任务/训练/推理 · 节点 · 分片 · 告警 · 多租户 · 插件 · 日志 │
└──────────────────────────────┬───────────────────────────────────────┘
│ REST /api/v1(JWT · 租户 API Key)
┌──────────────────────────────▼───────────────────────────────────────┐
│ API 层(Go,106 条路由注册;CORS / 审计 / 限流 / 租户上下文中间件) │
│ 业务域 26 组:任务/节点/租户/模型/分片/告警/网关/集群配置… │
│ + OpenAI 兼容推理口 /v1/* + Agent 分发与指令通道 + GPU 健康独立注册 │
├──────────────────────────────────────────────────────────────────────┤
│ 控制面服务群(单体二进制内,多实例部署 + advisory lock 选主) │
│ ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐ │
│ │ 调度器 │ │ AutoScaler │ │健康检查 │ │ 告警监控 │ │ 推理网关 │ │
│ │ 事件循环5s│ │ 30s │ │ 5s │ │ 30s │ │ 探测10s │ │
│ └──────────┘ └───────────┘ └──────────┘ └───────────┘ └──────────┘ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌────────────────────┐ │
│ │ 调度窗口 │ │ 孤儿分片GC │ │ 指标采集 │ │ GPU 故障预测 worker │ │
│ │ 60s │ │ 60s │ │ 30s │ │ │ │
│ └───────────┘ └───────────┘ └───────────┘ └────────────────────┘ │
└──────────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────────▼───────────────────────────────────────┐
│ PostgreSQL(38 张表;advisory lock 键空间:选主/配额/分片补偿/租户守卫) │
└──────────────────────────────┬───────────────────────────────────────┘
│ 纯出站轮询:心跳 5s · 任务拉取 5s · 指令轮询 5s
┌──────────────────────────────▼───────────────────────────────────────┐
│ Agent 群(每 GPU 节点一个,独立 Go 模块,X-API-Key 节点作用域) │
│ 硬件检测(10 检测器) · 执行器(Docker) · MPS/MIG · 拓扑 · 模型缓存 │
│ 推理引擎探测 · 模型扫描 · 掉卡探测(cardprobe) · 对账(60s) │
└──────────────────────────────┬───────────────────────────────────────┘
▼
GPU 节点(10 品牌硬件 + Docker,混插多厂商可同报)分层要点:Agent 是纯出站轮询进程、不监听任何端口——节点无需暴露入站端口、无需预注册,首次心跳即隐式建节点记录,天然适配 NAT 后的 GPU 节点;控制面对节点的全部"指令"(分片创建/销毁、文件/镜像请求)都落库为指令表,由 Agent 轮询认领,整个系统没有一条反向长连接。
组件交互的四条纪律贯穿全系统:① API 只经 Store 访问数据——handler 不写裸 SQL,租户过滤在存储层统一施加;② 调度器单事件循环单写者——所有对任务状态的迁移要么出自调度循环、要么走 CAS 原子翻转,多实例下交接窗口的正确性靠动作级 CAS 兜底;③ 对 Agent 永远下发意图而非命令——服务端落库的是"要什么"(分片指令、停止意图),Agent 幂等轮询执行并回报结果,双方都能安全重试;④ 破坏性操作失败语义显式化——MIG 分区销毁等操作按"已下发/已确认/已超时"三态记账,崩溃窗口由补偿扫描(advisory lock 9603)收敛。
后端架构
后端 Go 代码分四个物理边界:共享核心 core/pkg/、服务端专属包 pkg/、内置插件 plugins/、节点程序 agent/(独立 go.mod,不 import 主模块,保证 Agent 二进制可单独分发到任意架构节点)。
| 模块 | 职责 |
|---|---|
core/pkg/api/ | HTTP 服务与全部 handler:任务/节点/租户/告警/网关/模型/分片等 106 条路由注册、中间件链、推理网关代理 |
core/pkg/scheduler/ | 调度引擎:单事件循环 + 五阶段插件流水线、TaskGroup 组调度、抢占、AutoScaler、恢复与唤醒队列 |
core/pkg/storage/ | 存储抽象与双后端实现(postgres / memory),Storage 聚合接口暴露 27 个领域 Store 访问器 |
core/pkg/types/ | 跨模块共享类型(任务、节点、分片、TaskGroup 等) |
core/pkg/auth/ | 认证服务:JWT 签发校验、API Key 比对 |
core/pkg/ha/ | 高可用:advisory lock 选主生命周期 |
core/pkg/health/ | 节点健康状态机判定 |
core/pkg/gpu/ | GPU 抽象:Provider 接口 + 8 厂商实现 + 注册表 |
core/pkg/metrics/ log/ config/ constants/ | 指标暴露、日志、配置、常量 |
pkg/slice/ | GPU 分片管理:台账、分配算法、MIG/HAMi 适配器 |
pkg/agent/ pkg/executor/ | 服务端视角的 Agent 客户端与执行器对接 |
plugins/ | 8 个内置调度插件:binpack / spread / gpu_filter / resource_filter / preempt / rdma / nvlink / topology |
agent/(独立 go.mod) | 节点程序 13 个包:detection / executor / heartbeat / engine / mps / migctl / topology / modelcache / modelscanner / hygoncgroup / dirscan 等 |
v2/cmd/main.go | 服务端入口:装配全部组件、启动选主与周期任务 |
五阶段调度流水线位于 core/pkg/scheduler/scheduler_core.go 的插件周期(PreScore → Filter → Score → PostScore,见《GPU 统一调度》篇),Bind 阶段在调度核心内完成资源复核、端口分配与 CAS 认领(pending→scheduled 原子 UPDATE,从根上防多实例/多轮次双绑)。
GPU 抽象是异构能力的地基:服务端 core/pkg/gpu/ 以 Provider 接口 + 注册表收敛 8 家厂商差异(NVIDIA/海光/昇腾/寒武纪/壁仞/摩尔线程/昆仑/AMD),调度器只面对统一的类型枚举与显存/算力语义;Agent 侧 detection/ 以 Detector 接口对同一批厂商做统一探测(多路径:设备节点 / sysfs / 厂商管理工具)。两层各自独立演进——服务端加一种卡不必改 Agent,反之亦然;海光 DCU 另有 cgroup 级执行通道(hygoncgroup)。插件化则让调度策略可插拔:8 个内置调度插件(binpack/spread/gpu_filter/resource_filter/preempt/rdma/nvlink/topology)实现 Plugin / FilterPlugin / ScorePlugin 扩展点,开关与权重经 /api/v1/plugins 热调;通知插件服务于告警渠道。TaskGroup 组调度(推理副本编排与 DDP/DeepSpeed/FSDP 训练组)复用同一条流水线:按并行策略拆分子任务、拓扑感知选节点组、注入 WORLD_SIZE/RANK/MASTER_ADDR 环境变量后逐个走标准绑定路径。
控制面服务群逐组件
每个组件的运行方式与节拍(数字均为代码常量,非配置值):
| 组件 | 职责 | 运行方式 | 周期 | 关键机制 |
|---|---|---|---|---|
| 调度器事件循环 | pending 任务调度、积压恢复、推理重建、唤醒巡检 | leader-only | 主 tick 5s;积压回收 60s;推理恢复 10s;唤醒队列 15s | 单 goroutine 串行化;每轮上限 200 个 pending,游标接力防饿死;Score 插件并行打分 |
| 抢占看门狗 | 强推超时未确认的 preempting 任务回 pending | leader-only | 30s | 防永久过渡态 |
| AutoScaler | 推理 TaskGroup 按指标扩缩副本 | leader-only | 30s | GPU 利用率/显存驱动;扩容受租户配额 advisory lock 约束 |
| HealthChecker | 节点在线/可疑/离线状态机判定 | leader-only | 5s | 三态状态机 + 三套阈值并存 |
| AlertMonitor | 告警巡检、去重、自动消解、节点离线任务迁移 | 所有实例各跑一份(不经 leader 门控) | 30s | 去重作用域登记表;离线 45s 迁 running/scheduled 任务回 pending 温和重试 |
| 网关健康探测 | 推理后端 HTTP/TCP 探活、摘除与回切 | leader-only | 10s | 每轮全端点探测;重启动即重置告警对账 |
| 网关过期清理 | 清理无活跃任务的网关记账 | 常驻 | 5 分钟 | 以非终态任务集合为活跃判据 |
| 调度窗口执行器 | 按时间窗 pause/scale/stop 推理服务 | leader-only | 60s | 支持跨午夜窗口 |
| 孤儿分片 GC | 回收无主 GPU 分片、账本对齐 | leader-only | 60s | 升主时先以 DB 为准重同步分片账本 |
| 服务器指标采集 | 控制面本机 CPU/内存入 server_metrics | leader-only | 30s | 多实例下仅 leader 写,避免混入多主机数据 |
| GPU 故障预测 worker | 显存增长趋势规则预测、GPU 健康样本 | leader-only | 独立节拍 | 规则有效性尚未经真实数据充分验证(诚实口径见《GPU 健康与故障预测》篇) |
| 训练检查点 / 文件 / 镜像请求通道 | 大文件传输与镜像预拉指令编排 | 常驻(janitor 各自节拍) | — | 指令表 + Agent 轮询认领 + 超时清理 |
> AlertMonitor 是唯一不受选主门控的巡检组件:告警可见性在每个实例上都保持新鲜;代价是"必须单写者"的迁移写路径靠任务行级 CAS 保证不重复迁移。
Agent 架构
Agent 是独立编译的静态链接二进制(heteroflow-agent,go 1.21 模块),一键部署脚本分发,systemd 托管。所有请求仅携带 X-API-Key(与控制面共享的 agent_secret,服务端对其施加节点作用域查询约束:取任务必须带 node_id+status、禁止创建任务)。核心组件:
| 组件 | 职责 | 节拍 |
|---|---|---|
| heartbeat | 心跳上报:逐卡指标、live_task_ids、任务健康、引擎/模型/版本指纹、分片能力位 | 默认 5s(可配 5–300s);失败指数退避上限 5 分钟 |
| detection | 10 个检测器覆盖 11 种 GPU 类型(摩尔线程/海光/寒武纪/壁仞/昇腾/昆仑/天数/NVIDIA/沐曦/燧原 + 纯 CPU 节点 virtual 兜底);混插多厂商全量上报;含 NVIDIA 掉卡逐卡探测(cardprobe) | 启动检测 + 每轮心跳采集;外部命令统一 10s 超时 |
| executor | Docker 容器全生命周期:CAS 认领(scheduled→running,409=被抢)、Rank 注入、MPS/MIG 分片挂载、健康探针、超时看门狗、优雅停止 | 每 5s 拉取;60s 对账循环收养失联容器/补报终态;终态上报失败有限重试后保留容器交对账兜底 |
| mps / migctl | NVIDIA MPS 守护进程管理(daemon 侧显存上限)、MIG 分区创建/销毁命令层 | 分片指令每 5s 轮询认领 |
| engine | 推理引擎可用性探测:vLLM / SGLang / llama.cpp / TRT-LLM / MindIE 版本识别 | 随心跳上报 |
| topology | nvidia-smi topo -m 解析 NVLink/NUMA 机内拓扑标签 | 默认每小时刷新,有变化随心跳上报 |
| modelcache / modelscanner | 共享存储模型本地 SSD 缓存(LRU 驱逐、硬链接优化)/ 本地模型目录扫描 | 按需 + 随心跳上报 |
Agent 与控制面的每类交互(任务 / 分片 / 文件 / 镜像指令)都是"指令表 + 轮询 + CAS 认领"同一骨架,进程重启后靠 60s 对账自动收敛与服务端的认知差,任意网络条件下幂等可恢复。
前端架构
单页应用(SPA),实况技术栈 React 19 + TypeScript + Vite + Tailwind CSS,图表 ECharts / Recharts,路由 react-router-dom。无全局状态库,按 React 惯用法分层:auth/AuthProvider(Context 管登录态与租户角色,localStorage 缓存)、hooks/(useApiData / useNodes / useTasks 等数据钩子)、api/(按域拆分的请求模块,原生 fetch 封装:超时 / 指数退避重试 / 四类错误分级)、pages/(28 路由页面)与 components/(按域组织的通用组件)。28 个路由全列:
| 路由 | 页面 | 路由 | 页面 | 路由 | 页面 |
|---|---|---|---|---|---|
| /login | 登录 | /volumes | 存储卷 | /tenants | 租户管理 |
| / | 仪表盘 | /slices | 分片管理 | /tenants/share-groups | 共享租户组 |
| /environment | 环境总览 | /slices/:id | 分片详情 | /tenant/api-keys | 租户 API Key |
| /plugins | 插件管理 | /slices/:id/metrics | 分片指标 | /tenant/usage | 租户用量 |
| /nodes | 节点管理 | /logs | 日志审计 | /tenant/audit-logs | 租户审计 |
| /nodes/monitor | 节点监控 | /alerts | 告警中心 | /tenant/users | 租户成员 |
| /nodes/gpu-health | GPU 健康 | /users | 用户管理 | /logout | 登出 |
| /tasks | 任务列表 | /settings | 系统设置 | /tenant | 租户首页 |
| /tasks/create | 创建任务 | /inference | 推理服务 | /training | 训练任务 |
| /training/create | 创建训练 | — | — | — | — |
生产形态是 Vite 构建产物由静态服务器托管,API 请求经反代到控制面 3333 端口。
关键数据流
① 任务全链路(普通 Docker 任务)
创建 POST /api/v1/tasks → 租户/配额检查(配额临界区 advisory lock)
→ 任务 pending 入队(容量 1000 单队列,优先级 0-100 降序 + FIFO)
调度 事件循环 5s tick → 内置过滤链(离线→租户→VRAM→反亲和→模型→分片租户)
→ 插件周期 PreScore → Filter → Score(并行加权)→ PostScore
绑定 BindTask:负载阈值复核 + 端口分配 + DB CAS pending→scheduled(防双绑)
(分片任务在此完成 GPU 分片分配与 QoS 推导)
执行 Agent 每 5s 拉取 scheduled → CAS 认领 running(409 让步)
→ 模型缓存 Ensure → docker run → 探针/看门狗/优雅停止监测
回报 容器退出 → CAS 上报终态 + exit_code(失败有限重试,未送达保留容器
由 60s 对账补报)→ GPU-秒用量结算
兜底 节点失联 45s → AlertMonitor 迁任务回 pending 温和重试;
停滞回收 60s;节点故障统一处置政策裁决 container_lost 等场景② 推理调用链(OpenAI 兼容网关)
客户端 → POST /v1/chat/completions(Bearer 端点 API Key + key 级限流)
→ 模型名解析 + 模型路由策略 → 定位推理端点(endpoint)
→ 选后端:会话粘性五级 key 级联①X-Session-Id 头 →②prompt_cache_key
→③user →④hash(system+user[0]+assistant[0]) →⑤hash(system+user[0])
未命中/关闭粘性 → 负载均衡(round_robin / random / least_connections)
→ 代理到该后端对应的推理容器(vLLM/SGLang/llama.cpp/TRT-LLM/MindIE)
→ 用量回写:token 计量、GPU-秒结算、连接计数(供 least_connections)网关不做跨实例内存共享——多实例部署时 PostgreSQL 是唯一共享权威源(后端存活、连接计数落库),不引入 Redis/MQ。
③ 心跳链路(Agent → 控制面)
采集 CollectAllStats 逐卡(温度/利用率/显存/compute_capability)
+ /proc CPU/内存两次采样 + docker inspect 实测 live_task_ids
+ task_health 探针 + 引擎/模型/构建指纹 + gpu_capabilities 分片能力位
上报 POST /api/v1/nodes/{id}/heartbeat(X-API-Key;未知节点隐式注册)
处理 更新 nodes/gpus 与 last_report_at → HealthChecker 5s 状态机
(online/suspect/offline)→ AlertMonitor 30s 巡检与自动消解
消费 调度器下一轮把 GPU 余量/能力位(MIG→gold、MPS→silver、无→bronze)
/拓扑标签/引擎分布纳入过滤与打分;计量侧按活跃任务结算 GPU-秒多实例与高可用
控制面支持多实例部署,单集群控制面 HA(不做跨集群管理——多集群 API 是占位实现,不参与调度),机制全部构建在 PostgreSQL advisory lock 上:
| 机制 | 说明 |
|---|---|
| 选主 | 各实例用专用连接执行 pg_try_advisory_lock(lock class 9527)抢主;锁绑定连接,连接池复用会使锁失效,因此独占连接 + 每 2s ping 保活 |
| 防双主双保险 | 第一道是锁本身;第二道是抢锁语句失败/连接失效时立即降级 follower 并停全部周期任务 + ERROR 留痕 |
| 故障接管 | leader 崩溃 → PostgreSQL 自动释放锁 → follower 抢到接管,真机实测交接窗口约 722ms,窗口内正确性由动作级 CAS + 配额 advisory lock 兜底 |
| follower 仍服务 | 读写 API 与网关代理在所有实例可用;/health 对 follower 降级 200-degraded,不被负载均衡误摘 |
| 升主恢复 | 先以 DB 为准重同步分片账本,再拉起全部 leader-only 周期任务 |
| 跨实例锁键空间 | 9601 租户配额临界区、9603 MIG 崩溃窗口补偿、9604 任务组租户守卫触发器、9605 一键建推理服务;阻塞锁池连接上限 MaxConns/4、超时 fail-closed |
已知边界(如实声明):网络分区型"真双主"未做过实测,降级感知最长 2 秒窗口内可能短暂双主,对策是降级 ERROR + 停任务;不应宣传为"完全杜绝双主"。
存储架构
双后端:PostgreSQL(生产唯一持久化后端) 与 Memory(单测/单机),同一套 Storage 聚合接口(27 个领域 Store 访问器,其中 16 个有独立小接口约束)。38 张表按域分组:
| 域 | 表 |
|---|---|
| 节点与 GPU | nodes、gpus、node_labels、node_metrics、gpu_health_samples、gpu_fault_predictions |
| 任务与编排 | tasks、task_labels、task_groups、task_fault_events |
| GPU 分片 | gpu_slices、slice_operations |
| 推理与模型 | inference_endpoints、models、model_routes、model_routing_policies |
| 多租户 | tenants、tenant_users、users(平台管理员账号,与租户成员表分离)、tenant_api_keys、tenant_api_key_usage、tenant_audit_logs、tenant_share_groups、tenant_share_group_members、tenant_usage_daily、tenant_usage_events |
| 运维与观测 | alerts、alert_rules、logs、server_metrics、system_config、plugin_configs、energy_accumulators(能耗累计,A 类能耗统计的数据底座) |
| Agent 指令通道 | agent_slice_requests、agent_file_requests、agent_image_requests |
| 存储 | storage_volumes |
并发控制四件套:乐观锁版本号(防更新覆盖)、状态机 CAS(任务认领/终态翻转原子化)、advisory lock(跨实例临界区)、事务 + Context 传播纪律。schema 由 CreateTables 统一管理,存量库靠 scripts/sql/ 幂等迁移脚本(编号至 039,028/029 为预留号未用)补齐,另有 db-drift-check 自查工具。
技术栈清单
| 层 | 技术 | 版本(实况) | 用途 |
|---|---|---|---|
| 控制面 | Go | 1.25 | 单体二进制:API/调度/网关/告警 |
| Agent | Go(独立模块) | go 1.21 指令 + 1.25 工具链编译 | 节点守护进程,静态链接单文件分发 |
| 前端 | React + TypeScript | 19.x + TS 5.9 | SPA |
| 构建 | Vite | 8.x | 前端构建与开发代理 |
| 样式/图表 | Tailwind CSS · ECharts · Recharts | 4.x · 6.x · 3.x | UI 与可视化 |
| 持久化 | PostgreSQL | 16(开发环境实测) | 唯一持久化后端 + 选主/配额锁载体 |
| 容器 | Docker | — | 任务/推理统一执行载体 |
| 明确不引入 | Redis / etcd / MQ / K8S | — | 跨实例共享用 PostgreSQL,选主用 advisory lock,刻意保持依赖面最小 |
部署拓扑
单机一体:server 二进制 + PostgreSQL + 前端静态服务同机,适合小规模与开发环境。
控制面 + 多 Agent(标准形态)
┌────────────── 控制面(可多实例)──────────────┐
│ server × N + PostgreSQL(选主 advisory lock)│
└───────┬───────────────┬───────────────┬──────┘
│ 心跳/拉任务 │ │
┌───────▼──────┐ ┌───────▼──────┐ ┌──────▼───────┐
│ Agent+GPU 节点│ │ Agent+GPU 节点│ │ Agent(CPU) │
│ NVIDIA / 国产 │ │ 混插多厂商 │ │ virtual 兜底 │
└──────────────┘ └──────────────┘ └──────────────┘节点只需能出站访问控制面 3333 端口——NAT 后的节点、跨网段节点均以纯出站轮询接入,公网/内网双 IP 与 heteroflow.network_zone 网络域标签解决内网撞址与连通性判定。多实例 HA:N 个 server 实例共指一个 PostgreSQL,抢主接管如上节。
部署就两条命令:服务端 ./manage-services.sh start all(server 二进制 + PostgreSQL + 前端静态服务);GPU 节点 curl -fsSL http://SERVER:5173/deploy-agent-all-in-one.sh | bash 一键完成 GPU 类型检测、厂商管理工具 wrapper 安装、Agent 二进制下载、配置生成与 systemd 托管。Agent 版本随平台同步演进,控制面提供 /static/agent 分发与快速更新脚本。
安全架构摘要
认证授权四类凭据两条路径:JWT(Web 登录,token_version 支持即时吊销)、租户 API Key(sk-tenant- 前缀,成员级独立 key 与限额)、X-API-Key(Agent 共享密钥 + 服务端节点作用域约束)、端点 API Key(推理网关,可轮换/撤销)。租户隔离下沉到 SQL 层——所有业务表带 tenant_id,查询统一走租户过滤;三层权限(admin / member / viewer)决定资源可见性与写权限;跨租户共卡/复用仅限管理员配置的共享租户组内,组外完全隔离。生产模式 fail-fast:启动姿态检查(外部可达 + 默认凭据等危险组合)会拒绝启动或 ERROR 留痕。详细模型见《多租户》与认证授权篇。
<!-- 状态标注说明:本文所有组件周期数字(调度 5s/积压 60s/推理恢复 10s/唤醒 15s/抢占看门狗 30s/AutoScaler 30s/健康检查 5s/告警 30s/网关探测 10s/网关清理 5min/调度窗口 60s/分片 GC 60s/指标采集 30s/选主保活 2s/Agent 心跳 5s/对账 60s)均为代码常量核实值;路由 106 条 = server.go 102 条 HandleFunc + GPU 健康独立注册 4 条;表 38 张为 schema.go 实数(含 users 平台管理员表与 energy_accumulators 能耗累计表)。多集群管理为占位实现不参与调度,本文仅描述"单集群控制面多实例 HA"。NVLink 拓扑采集代码就绪但机内 NVLink 联调未做(历史节点均 PCIe 形态);国产卡检测已适配、端到端验证以 NVIDIA 节点为准。 -->