V2.3.0 发布
总览
HUATUO v2.3.0 将节点级内核观测能力扩展为覆盖异常发现、实时取证、性能剖析和集中查询的诊断链路。
下文介绍主要变化。完整配置和使用方法见 HUATUO 中文文档。
1. 性能剖析
1.1 统一剖析工具
新增独立的 profiler 工具,以统一命令行剖析原生程序、Java 和 Python:
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. 网络与事件诊断
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
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. 平台、存储与部署
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. 升级后建议优先验证
- 访问 Agent 和 API Server 的
/healthz、/version,确认服务状态正常且版本一致。 - 调用
/v1/profiles/capabilities,根据节点依赖确认可用的剖析模式。 - 在非生产流量上验证 dropwatch、tcpshark 的 pcap 过滤和事件限速。
- 根据环境选择 Elasticsearch、OpenSearch 或本地文件,验证退出前数据已排空,并确认 API Server 的 SQLite 任务库位于持久化目录。
- Kubernetes 部署使用固定版本镜像,并按文档配置 requests/limits;生产环境不要使用 latest。