🚀 2025 年中国信息通信研究院《OSCAR 尖峰开源项目及开源社区》、腾讯科技《杰出贡献奖》、CNCF Landscape。欢迎 GitHub ❤️

发展历程

V2.3.0 发布

总览

HUATUO v2.3.0 将节点级内核观测能力扩展为覆盖异常发现、实时取证、性能剖析和集中查询的诊断链路。

HUATUO v2.3.0 核心能力总览

下文介绍主要变化。完整配置和使用方法见 HUATUO 中文文档

1. 性能剖析

1.1 统一剖析工具

新增独立的 profiler 工具,以统一命令行剖析原生程序、Java 和 Python:

HUATUO v2.3.0 统一剖析能力矩阵

profiler 支持宿主机、PID 和容器三类目标:

  • Java 和 Python 支持同时采集多个 PID;
  • 原生程序支持按线程组采集;
  • 支持按 CPU 列表或范围限制采样;
  • 容器进程通过本机 cgroup 解析,无需依赖 kubelet;
  • 支持 collapsed、交互式 SVG 火焰图和远端 pprof 输出。

1.2 Off-CPU 剖析

Off-CPU 剖析通过 sched_switch、sched_wakeup 等调度 tracepoint,记录任务离开 CPU 到再次运行的时间,并按等待原因分类:

  • blocked: 等待锁、I/O 或其他事件;
  • runqueue: 任务已经可运行,但仍在运行队列中等待 CPU;
  • runqueue_preempted、runqueue_yielded: 标识任务进入运行队列的原因;
  • runqueue_missed_wakeup: 未观测到唤醒事件时的保守分类。

采集时可限定 blocked 或 runqueue、设置最小时长,并按 CPU 集合缩小范围。用于排查 BPF 采集质量的诊断统计默认关闭,可按需启用。

1.3 原生内存剖析

  • virtual_alloc: 归因匿名映射等虚拟地址空间分配;
  • physical_alloc: 归因采集窗口内新增的物理页分配;
  • physical_usage: 跟踪页分配与释放,输出采集结束时仍驻留的物理页调用栈。

物理内存事件支持概率采样,可在分析精度和运行开销之间取舍。physical_usage 兼容不同内核的 page/folio 布局和批量释放路径。

1.4 服务化持续剖析

新增 huatuo-apiserver 控制面和 /v1/profiles API,支持:

  • 查询服务端支持的语言、CPU 模式和内存模式;
  • 创建、分页查询、停止和删除剖析任务;
  • 按主机、容器和进程向节点 Agent 下发任务;
  • 按固定窗口聚合并持久化长时间剖析数据;
  • 查询原始结果,并通过 Pyroscope 兼容接口接入 Grafana;
  • 持久化任务状态,服务重启后恢复未完成任务;
  • 通过 Bearer Token、路径权限和并发配额控制访问。

同时提供宿主机和容器 Grafana 持续剖析面板。未启用剖析数据存储时,API Server 仍可提供任务控制和能力查询。

1.5 终端火焰图

perf 工具新增 TUI 火焰图,可直接在 SSH 终端中展开、折叠和浏览调用栈,无需将结果传到浏览器,适用于受限生产环境中的即时诊断。

2. 网络与事件诊断

HUATUO v2.3.0 网络与事件诊断链路

2.1 软件与硬件丢包

新增独立的 dropwatch 工具,将 Agent 内置的丢包事件扩展为可按需运行的诊断能力:

  • 支持 tcpdump 风格的 pcap 表达式,在 BPF 侧提前过滤报文;
  • 支持网卡包含、排除和正则匹配;
  • 支持事件限速,避免丢包风暴压垮输出链路;
  • 解析协议、五元组、内核调用栈和丢包原因;
  • 通过 memcg、netns 标识关联容器;
  • 支持终端输出,也可通过 toolstream 交给 Agent 持久化。

pcap 过滤器由纯 Go 实现,无需依赖 libpcap 和 cgo。

dropwatch 还可通过 devlink_trap_report 采集网卡 ASIC 丢包,并纳入统一事件模型:

  • 通过 source=hardware|software 区分硬件与协议栈丢包;
  • 输出 trap name 和 trap group;
  • 对硬件上报后继续进入 kfree_skb 的同一 skb 做时间窗去重。

2.2 TCP 重传与丢包关联

新增 tcpshark 工具和 tcp_retransmit 事件,采集数据重传、SYNACK 重传及可选的 Tail Loss Probe。事件包含连接四元组、序列号范围、拥塞状态、重传计数、乱序和 DSACK 上下文,并对重传原因分类。

dropwatch 可在时间窗内按 skb 地址或连接四元组关联丢包与重传,记录疑似丢包位置。tcpshark 同样支持 pcap 表达式和事件限速。

2.3 网络接收延迟

net_rx_latency 新增以下能力:

  • 兼容 Linux 5.15、6.8 及相关发行版回移的 skb 时间戳布局;
  • 覆盖非 ESTABLISHED 状态的 TCP 接收路径;
  • 增加 network namespace cookie,并与 dropwatch 对齐字段名;
  • 分段上报驱动到协议栈、协议栈处理及拷贝到用户态的慢包延迟。

2.4 实时事件订阅

Agent 新增 POST /v1/events/watch,通过 Server-Sent Events 持续推送内核事件。订阅端可按 tracer、主机、region、容器主机名、容器 namespace 和容器 QoS 进行正则过滤;多个条件按 AND 语义匹配。

服务端提供连接数限制、心跳和慢客户端隔离。事件仍会写入已配置的持久化后端,实时订阅不替代历史留存。

3. 指标与 AutoTracing

HUATUO v2.3.0 指标与 AutoTracing 能力

3.1 昇腾 NPU 指标

新增 ascend_npu collector,通过 DCMI、HCCN 工具和 PCIe sysfs 采集:

  • 设备健康、功耗、温度和电压;
  • AI Core、Vector Core、AI CPU、Ctrl CPU 的利用率与频率;
  • HBM 容量、使用率、温度、带宽和 ECC 错误;
  • PCIe 当前速率、能力速率和链路宽度;
  • HCCS/RoCE 端口状态、吞吐、错误、重传、乱序、CNP 和 PFC;
  • 光模块温度、电压、光功率、偏置电流、LOS 和 SNR。

动态库或设备能力不可用时,collector 会跳过对应指标,不影响其他采集器运行。

3.2 磁盘 I/O 指标

新增磁盘 I/O 基础 collector 和 eBPF 延迟指标:

  • /proc/diskstats 输出吞吐、IOPS、队列和利用率等设备指标;
  • 分别统计请求从入队到完成(Q2C)、下发到完成(D2C)的延迟;
  • 同时提供块设备和容器 blkcg 维度。

3.3 OOM 与硬件错误

  • OOM 事件新增内存限额、当前用量及系统/容器内存快照,可同时查看触发进程、被终止进程和故障时的内存压力;
  • RAS 新增 ARM GHES 处理器错误支持,并统一 MCE、EDAC、ACPI GHES、PCIe AER 的结构化输出;
  • 启动 RAS BPF 前探测所需 tracepoint;精简内核缺少相关能力时自动降级;
  • 网卡设备配置支持正则列表;
  • CPU 指标新增基于 wait_sum 的外部等待率;
  • 采集器启动时检查依赖的 procfs 和定制 memcg 接口,缺失能力不再导致整组指标失败。

3.4 AutoTracing

v2.3.0 对已有的 cpuidle、cpusys、dload、iotracing、memburst 自动追踪能力做了以下增强:

  • cpuidle 支持容器过滤,避免系统组件及非目标工作负载触发采集;
  • 已知问题规则由单一 pattern 扩展为可组合的 IssuesList;
  • CPU 触发条件统一支持绝对阈值和增量阈值,降低稳态高负载下的误触发;
  • iotracing 严格执行进程数和单进程文件数上限;
  • 自动追踪结果接入统一的 profiler/toolstream 存储链路。

4. 平台、存储与部署

HUATUO v2.3.0 平台、存储与部署架构

4.1 控制接口

新增节点任务的创建、列表、查询和停止接口,以及 tracer 的列表、启动、停止和配置更新接口。所有主要二进制统一支持版本输出;HTTP 服务提供 /healthz/version;API Server 新增请求指标和调试日志开关。

4.2 存储后端

存储层改为驱动注册模式,新增或完善:

  • Elasticsearch 7/8 和 OpenSearch 兼容后端;
  • 按 tracer 分文件并支持轮转的本地数据日志;
  • 用于 API Server 持久化任务状态的 SQLite 后端;
  • tracing 事件同时写入本地文件和已配置的远端后端;
  • 退出前排空异步写入队列,避免正常关闭时丢失数据;
  • insert-only 写入,防止相同 ID 的记录被静默覆盖。

4.3 Kubernetes、开发环境与可视化

  • 新增 Helm Chart,支持配置 ConfigMap、DaemonSet、资源、hostPath、nodeSelector 和 toleration;
  • DaemonSet 新增 Prometheus 自动发现注解;
  • Prometheus 示例新增 Kubernetes 服务发现和 relabel;
  • Docker Compose 新增开发环境和服务健康检查;
  • 文档提供生产资源 requests/limits 基线,以及 Helm 更新和回滚流程;
  • Agent 自身的 cgroup 限制改为显式启用,避免与 Kubernetes Pod 的 cgroup 生命周期冲突。

新增宿主机与容器持续剖析面板、磁盘 I/O 面板,并更新主机、容器和 AutoTracing 面板。完整 Compose 环境内置 Elasticsearch、Prometheus、Grafana 和剖析查询链路,可验证从指标、事件到火焰图的完整诊断流程。

4.4 可靠性与兼容性

  • toolstream: 基于 Unix Socket 的类型化事件通道,统一承载 dropwatch、iotracing 和 profiler 子进程输出;
  • BPF ABI: 以 C 头文件为唯一真源,自动生成 Go 结构体和枚举,避免 BPF 与用户态结构偏移不一致;
  • 生命周期: 加固 BPF 对象热更新与读取流程,避免已关闭对象仍被指标循环访问;
  • 兼容性: 增加 ARM GHES、folio、skb 时间戳和 tracefs kprobe 符号等多版本探测路径;
  • 诊断能力: BPF 调试输出增加源码文件、行号和墙上时钟;
  • 性能与可靠性: 支持 CPU 事件批量读取、perf reader 丢样后继续运行及可配置的 kretprobe 并发,并减少 BPF 热路径分配。

5. 升级后建议优先验证

  1. 访问 Agent 和 API Server 的 /healthz/version,确认服务状态正常且版本一致。
  2. 调用 /v1/profiles/capabilities,根据节点依赖确认可用的剖析模式。
  3. 在非生产流量上验证 dropwatch、tcpshark 的 pcap 过滤和事件限速。
  4. 根据环境选择 Elasticsearch、OpenSearch 或本地文件,验证退出前数据已排空,并确认 API Server 的 SQLite 任务库位于持久化目录。
  5. Kubernetes 部署使用固定版本镜像,并按文档配置 requests/limits;生产环境不要使用 latest。