导读
面向操作系统的可观测性工具 HUATUO 项目开源了。
现在,即刻部署 HUATUO + 夜莺 Nightingale 工具组合,快速构建覆盖应用、中间件、数据库、操作系统内核的一体化可观测体系!

本文围绕三个问题展开:
- HUATUO 要解决什么生产环境问题?
- 它为什么选择用 eBPF 常态化采集操作系统指标?
- AutoTracing 在 CPU、负载、内存和 IO 异常时分别能保留哪些现场?
HUATUO 的产生背景
2016年滴滴开始转向云原生架构,以K8s为基础,构建了内部的弹性云计算平台,并逐步实现了全量服务的容器化。在这个过程中,面临着一些关键的挑战:
- 容器密度高、集群规模大
- 服务延迟敏感、稳定性要求高
- 在离线工作负载混合调度
- 集群资源利用率很高
在维护弹性云计算平台的工作中,最耗时费力的问题莫属追查生产环境性能瓶颈。一个实例性能毛刺的排查,有时候需要花费好几天还找不到头绪,不仅要排查应用层面的各种指标、日志和链路跟踪数据,还得重点排查容器与容器之间、以及宿主对目标容器的干扰。要准确的定界并分析这些问题,少不了“现场还原”。在大规模、高负载的环境下,“现场还原”不是一件容易的事情。
这也是操作系统可观测性的核心价值:当应用指标只能告诉你“慢了、错了、资源不够了”,内核层面的指标和异常上下文能进一步回答“系统调用、中断、调度、内存回收、IO、D 状态进程到底发生了什么”。
HUATUO 的核心能力
在这个背景下,滴滴研发了针对操作系统的实时监控工具 HUATUO,利用 eBPF 技术,常态化运行并全面收集内核各个子系统的统计指标和异常事件(性能损耗小于1%),并根据生产环境经验值,当统计指标达到一定阈值或者出现某种异常事件时,HUATUO 从内核自动抓取异常上下文现场并及时保存,如抓取用户调用栈、系统态调用栈生成火焰图、异常中断上下文等重要信息。
华佗常态收集的操作系统层面的统计指标如下,有接近 300 项:

可以使用 Grafana 或者夜莺生成这些统计指标仪表盘,实时全面掌握内核工作情况:

需要注意的是,统计指标的收集是常态化运行的,HUATUO 确保性能损耗小于1%。但抓取调用栈生成火焰图的行为是“触发式”的,触发条件为当统计指标达到一定阈值或者出现某种异常事件。HUATUO 内置的自动触发条件(包括不限于)如下所示(也称之为 HUATUO AutoTracing)。
| 能力 | 触发关注点 | 排查价值 |
|---|---|---|
| CPUSYS | 系统态 CPU 异常 | 定位系统调用、中断、内核线程、内存回收或锁竞争 |
| CPUIDLE | CPU idle 突然下降 | 判断容器进程是否过度消耗 CPU |
| DLOAD | D 状态进程负载异常 | 识别 I/O、硬件驱动或锁等待导致的不可中断阻塞 |
| MemBurst | 短时间大量内存分配 | 保存突发内存分配上下文,辅助判断直接回收或 OOM 风险 |
| IOTracing | IO 带宽占满或延迟异常 | 输出异常时访问的文件、磁盘设备、inode、容器等上下文 |
HUATUO AutoTracing 机制
CPUSYS
系统态 CPU 时间反映内核执行开销,包括系统调用、中断处理、内核线程调度、内存管理及锁竞争等操作。该指标异常升高,通常表明存在内核级性能瓶颈:高频系统调用、硬件设备异常、锁争用或内存回收压力(kswapd 直接回收)等。Huatuo 检测到该指标异常时,自动会触发抓取系统的调用栈并生成火焰图,帮助定位问题根因,其触发条件如下:
CPU Sys 使用率 > 阈值 A
CPU Sys 使用率单位时间内增长 > 阈值 B
CPUIDLE
K8S 容器环境,CPU idle 时间(即 CPU 处于空闲状态的时间比例)的突然下降通常表明容器内进程正在过度消耗 CPU 资源,可能引发业务延迟、调度争抢甚至整体系统性能下降。HUATUO 根据以下条件,自动触发抓取调用栈生成火焰图:
CPU Sys 使用率 > 阈值 A
CPU User 使用率 > 阈值 B && CPU User 使用率单位时间增长 > 阈值 C
CPU Usage > 阈值 D && CPU Usage 单位时间增长 > 阈值 E
DLOAD
D 状态是一种特殊的进程状态,指进程因等待内核或硬件资源而进入的一种特殊阻塞状态。与普通睡眠(S 状态)不同,D 状态进程无法被强制终止(包括 SIGKILL),也不会响应中断信号。该状态通常发生在 I/O 操作(如直接读写磁盘)、硬件驱动故障时。
系统 D 状态突增往往和资源不可用或者锁被长期持有导致,可运行进程突增往往是业务代码设计不合理导致。Huatuo 借助 netlink 获取容器 running + uninterruptible 进程数量,通过滑动窗口算法计算出过去 1 分钟内容器 D 进程对负载做出的贡献值。当平滑计算后的 D 状态进程负载值超过阈值的时候,表示容器内的 D 状态进程数量出现异常,开始触发收集容器运行情况、D 状态进程信息。
MemBurst
MemBurst 用于检测宿主机上短时间内大量分配内存的情况。突发性内存分配可能引发直接回收甚至 OOM,所以一旦突发性内存分配就需要记录相关信息。
IOTracing
当 I/O 带宽被占满或磁盘访问量突增时,系统可能因 I/O 资源竞争而出现请求延迟升高、性能抖动,甚至影响整个系统的稳定性。IOTracing 在宿主磁盘负载高、IO 延迟异常时,输出异常时 IO 访问的文件名和路径、磁盘设备、inode 号、容器名等上下文信息。
开源意义
Huatuo 项目已捐赠给中国计算机学会(CCF),并加入其重点孵化项目序列,项目地址:https://github.com/ccfos/huatuo 。HUATUO 项目的开源,意义重大:
- HUATUO 的定位非常清晰准确,就是常态化运行实时获取操作系统的关键指标和异常行为,从内核角度获取并记录必要的异常上下文信息,开箱即用。填补了操作系统可观测性领域的空白。
- HUATUO 不仅仅是一个工具,更有价值的是大厂背后的技术深耕所积累的经验,HUATUO在滴滴大规模的生产环境场景下运行了好几年,操作系统的什么指标应该被采集、什么阈值下应该自动触发生成火焰图,都是宝贵的实战经验积累,这些经验以开源软件的方式开放到社区中,对行业是巨大的贡献。
- 滴滴HUATUO项目的开源和捐赠,给开源社区注入了新的力量和信心。
FAQ
Q1:HUATUO 和应用 APM、日志、Trace 是替代关系吗? 不是。APM、日志和 Trace 更偏应用层,HUATUO 补的是操作系统和内核侧现场。两者组合起来,才能覆盖应用、中间件、数据库、容器和宿主机之间的性能问题。
Q2:为什么要常态化采集指标,但触发式抓火焰图? 常态化指标用于持续观察系统状态;调用栈和火焰图信息更重,适合在指标异常或事件触发时保存现场。这样可以兼顾低开销和关键现场保留。
Q3:HUATUO 与夜莺组合使用的价值是什么? HUATUO 负责从操作系统内核侧提供指标和异常上下文,夜莺可以承接这些指标的大盘、告警和统一观测。组合使用时,团队可以把内核侧证据纳入整体可观测体系。
小结
HUATUO 的核心价值,是把生产环境中很难复现的操作系统现场,尽量在异常发生时自动留下来。对高密度容器、大规模集群、延迟敏感业务和混部场景来说,这类内核级可观测能力可以补齐应用层监控看不到的最后一公里。