字节跳动的 Deepflow:云原生时代的全栈可观测性平台
1. 引言
在云原生架构日益普及的今天,现代应用程序的复杂性也随之攀升。微服务、容器化和动态编排等技术的广泛应用,使得传统的监控手段在提供对系统行为的全面理解方面显得力不从心。仅仅依赖于基础的指标和日志数据,往往难以洞察分布式系统的内部状态,从而阻碍了对潜在问题的早期发现和高效解决。可观测性作为一种新兴的系统理解范式,旨在通过检查系统的外部输出来推断其内部状态,从而实现对复杂系统的积极管理和优化。这种理念不仅仅关注于系统是否正常运行,更侧重于理解系统为何如此运行,以及在出现问题时如何快速定位和解决。从控制理论的角度来看,可观测性是指系统内部状态可以通过其外部输出来确定的程度 。在复杂的 IT 系统中,具备良好的可观测性是确保系统达到预期的稳定性、错误率目标的关键。
面对云原生应用日益增长的复杂性,字节跳动推出了 Deepflow,一个高度自动化的可观测性平台,专为复杂的云原生和人工智能应用而设计 。Deepflow 源于字节跳动内部的实践,该公司在全球范围内运营着大规模的微服务架构 。为了鼓励全球可观测性领域的创新与贡献,Deepflow 的核心模块已采用 Apache 2.0 许可证开源 。Deepflow 的核心技术包括 eBPF(Extended Berkeley Packet Filter)、WASM(WebAssembly)和 SmartEncoding 等,这些技术共同实现了零代码侵入式的可观测性数据采集和高效的数据处理 。
2. Deepflow 的核心概念与功能
Deepflow 的核心在于提供全面的、自动化的可观测性能力,主要通过以下几个核心功能实现:
2.1 AutoMetrics:自动化的全栈性能指标
AutoMetrics 是 Deepflow 的核心功能之一,旨在自动收集覆盖应用程序、网络和系统各个层面的性能指标 。Deepflow 巧妙地利用 eBPF/cBPF 技术,实现了对多种常用应用协议(如 HTTP/1.2、HTTPS、Dubbo、gRPC、MySQL、Redis 等)以及网络协议(TCP/UDP)的非侵入式数据采集 。这种零代码的方式极大地简化了性能监控的实施过程,无需修改应用程序代码或部署额外的代理。通过对采集到的数据进行聚合和分析,Deepflow 能够计算出关键的 RED(Request/Error/Delay)指标,从而帮助用户快速识别系统中的性能瓶颈 。AutoMetrics 的一个重要体现是其“Universal Map”(通用地图)功能,它可以自动绘制生产环境的服务全景图,展示服务之间的依赖关系和性能指标,而这一切都无需任何代码变更 。
传统应用性能管理(APM)解决方案通常需要手动埋点或者安装具有侵入性的 Agent,这不仅增加了开发和运维的负担,还可能引入运行时冲突。AutoMetrics 凭借 eBPF 技术的零代码特性,直接解决了 Agent 侵入性的难题,使得性能监控能够更容易地在各种规模的环境中落地 。通用地图的功能则超越了传统监控仪表盘的局限,提供了一个即时且全面的服务健康和依赖关系视图,极大地加速了问题识别的过程。
2.2 AutoTracing:任意请求的零代码分布式追踪
AutoTracing 是 Deepflow 提供的另一个核心功能,实现了对微服务架构下分布式调用的自动追踪,同样无需任何代码插桩 。Deepflow 结合 eBPF/cBPF 和 WASM 技术,能够捕获跨越多种编程语言、网关、服务网格、数据库以及其他基础设施组件的调用链信息 。与传统的 APM 追踪方案相比,AutoTracing 无需依赖 SDK 和代码修改,从而避免了潜在的追踪盲点 。Deepflow 还能将网络性能指标和文件 I/O 事件与每个追踪 Span 相关联,为理解请求的完整执行过程提供了更丰富的上下文信息 。此外,Deepflow 支持解析应用程序注入的唯一请求 ID,从而能够处理跨线程和异步场景下的追踪 。
传统的分布式追踪系统往往需要开发人员在代码中手动添加追踪 ID 和 Span 信息,这不仅繁琐,而且容易遗漏,导致追踪不完整。AutoTracing 的零代码特性使得分布式追踪技术能够更广泛地应用于各种应用程序和团队,极大地降低了使用的门槛。通过集成网络性能和文件 I/O 数据,Deepflow 提供的追踪信息更加全面,有助于工程师快速定位那些由网络或 I/O 引起的性能问题。
2.3 AutoProfiling:任意函数的持续性能剖析
AutoProfiling 是 Deepflow 的第三个核心功能,它能够以低于 1% 的性能开销,持续地对生产环境中的进程进行性能剖析 。Deepflow 利用 eBPF 技术,生成函数级别的 On-CPU、Off-CPU、内存和 GPU 火焰图,从而精确定位应用程序、库函数和内核函数的性能瓶颈 。AutoProfiling 支持多种编程语言,包括 JVM 语言、C/C++/Golang/Rust,甚至包括 Python 等解释型语言 。此外,Deepflow 还利用 cBPF 分析网络中的逐包数据,在低内核环境下也能绘制每个 TCP 流的网络性能剖析图,用于分析网络相关的性能问题 。更重要的是,Deepflow 能够自动将性能剖析数据与分布式追踪数据关联起来,实现更全面的性能分析 。
与传统的按需性能剖析工具不同,AutoProfiling 提供的持续性能剖析能力,能够在问题发生之前就发现潜在的性能隐患。极低的性能开销保证了可以在生产环境中持续运行,从而能够捕获那些偶发性的、难以复现的性能问题。通过与分布式追踪数据的集成,开发人员不仅可以知道哪些请求比较慢,还可以深入分析造成这些延迟的具体函数和代码路径。
2.4 SmartEncoding:高效的数据标签与存储
SmartEncoding 是 Deepflow 实现高效数据管理的关键机制。它通过向所有可观测性信号注入标准化和预编码的元标签,极大地提升了标签写入性能,并降低了数据存储的资源开销 。Deepflow 能够自动注入与云资源、Kubernetes 容器以及自定义标签/注解相关的元数据 。SmartEncoding 机制将字符串格式的标签转换为整型存储到数据库中,使得标签写入性能提升高达 10 倍 。此外,Deepflow 将自定义标签与观测数据分离存储,支持近乎无限维度和基数的标签,同时保证了类似 BigTable 的查询体验 。
在高基数场景下,传统的标签存储和查询方式往往会面临性能瓶颈和存储成本过高的问题。SmartEncoding 通过其独特的编码和存储机制,有效地解决了这些挑战,使得 Deepflow 能够处理大规模、高维度的可观测性数据,并保持高效的查询性能。通过 API 注入业务相关的标签 ,SmartEncoding 还能够将技术可观测性数据与业务上下文对齐,为业务性能监控和分析提供有价值的见解。
3. Deepflow 的技术架构
Deepflow 采用客户端-服务器架构,主要包含两个核心组件:Deepflow Agent 和 Deepflow Server。
3.1 Deepflow Agent
Deepflow Agent 是部署在每个需要进行可观测性数据采集的主机上的组件 。Agent 使用 Rust 语言实现,具有极高的处理性能和内存安全性,这对于处理大量的 eBPF/BPF 数据至关重要 。Agent 可以运行在各种环境中,包括 Kubernetes 节点、传统主机、Serverless Pod 以及云主机 。它负责利用 eBPF/cBPF 技术,从宿主机上的所有应用程序进程中收集 AutoMetrics 和 AutoTracing 数据 。Agent 还支持多种部署场景,例如多租户 Serverless Kubernetes 节点、Android 设备、Windows 主机以及各种虚拟化平台(KVM/HyperV/ESXi/Xen)。更进一步,Agent 能够从支持 DPDK 的主机和物理服务器上采集网络流量,包括物理交换机的镜像流量和 NetFlow/sFlow 数据,从而分析传统四到七层网关和专有云四到七层网关的性能 。Deepflow 还提供了对 Agent 的远程管理和控制能力,包括生命周期监控和资源使用(CPU、内存、采集和分发速率)的限制 。
Agent 广泛的部署支持体现了 Deepflow 的通用性和灵活性,能够为各种复杂的 IT 基础设施提供全面的可观测性。选择 Rust 作为 Agent 的实现语言,充分体现了 Deepflow 对性能和资源效率的高度重视,这对于在大规模环境中部署可观测性平台至关重要。
3.2 Deepflow Server
Deepflow Server 是 Deepflow 的核心后端组件,负责 Agent 的管理、数据标签的注入、数据的接收和存储以及数据的查询服务 。Server 通常运行在 Kubernetes 集群中,支持水平扩展,以应对大规模的数据处理和查询需求 。Server 能够自动地根据 Agent 上报的数据量,动态地调整 Agent 与 Server 之间的通信关系,实现负载均衡 。企业版 Deepflow Server 还具备多集群和多区域的管理能力,可以统一监控和管理来自不同异构资源池和地理区域的 Agent 。此外,Server 还提供数据分析能力,包括指标、追踪和日志数据的关联查询,以及告警、报表和自定义视图等功能,支持多团队协作 。
将 Server 部署在 Kubernetes 上,充分利用了容器编排平台的弹性伸缩和高可用特性,保证了 Deepflow 本身的可靠性和可扩展性。多集群和多区域管理能力使得 Deepflow 能够满足大型企业和跨国公司的可观测性需求。
3.3 不同版本
Deepflow 提供三个不同的版本以满足不同用户的需求 :
- 社区版(Community Edition): 这是一个开源版本,提供了构建高效可观测性所需的常用功能,核心代码采用 Apache 2.0 许可证,前端基于 Grafana,采用 AGPL 许可证 。社区版包含了 AutoMetrics、AutoTracing、AutoProfiling 等核心功能以及基本的集成能力。
- 企业版(Enterprise Edition): 在社区版所有功能的基础上,企业版提供了更强大的数据采集、分析和管理能力 。例如,支持采集 TLS、Oracle 等应用调用日志,进行 TCP 流重组,支持 Off-CPU、内存和 GPU 的持续性能剖析,以及 Python 等解释型语言的剖析。企业版还与主流云平台(如阿里云、腾讯云、华为云)进行了深度适配,提供了更高级的分析特性(如指标、追踪、日志的关联查询、告警和报表等),以及多租户支持和更完善的企业级服务。
- 云服务版(Cloud Edition): 这是一个完全托管的一站式可观测性平台,拥有与企业版一致的功能,目前处于测试试用阶段 。
不同版本的 Deepflow 能够满足从个人开发者到大型企业的各种可观测性需求。社区版为用户提供了一个免费且功能强大的入门级选择,企业版则提供了更全面的功能和企业级的支持,而云服务版则进一步降低了运维成本,让用户可以专注于业务本身。
4. Deepflow 的关键特性与能力详解
Deepflow 的核心价值在于其一系列强大的特性和能力,这些特性共同构建了一个全面且易于使用的可观测性平台。
4.1 任意服务的通用地图
Deepflow 的通用服务地图功能基于领先的 AutoMetrics 机制和 eBPF 技术,能够以零侵入的方式绘制生产环境的服务全景图,覆盖任何语言开发的服务、第三方服务以及所有云原生基础设施服务 。它内置了对大量应用协议的解析能力,并提供了 Wasm 插件机制,可以扩展解析任何私有协议 。Deepflow 能够零侵入地计算每一次调用在应用程序和基础设施中的全栈黄金指标(RED),从而快速定位性能瓶颈 。例如,Deepflow 可以帮助用户在 5 分钟内定位访问共享服务的最频繁客户端,或者发现被忽视的共享服务和背景压力 。
通用服务地图提供了一个直观的方式来理解复杂系统的服务依赖关系和性能状况。无需修改代码即可自动发现和展示服务拓扑,极大地简化了故障排除和性能分析的过程。
4.2 任意调用的分布式追踪
Deepflow 创新性地实现了零侵入的分布式追踪(AutoTracing)。在采集调用日志时,Deepflow 基于系统调用上下文计算出关键的追踪信息,无需修改应用代码或注入 TraceID/SpanID 即可实现分布式追踪 。目前,Deepflow 除了跨线程和异步调用外,都能实现零侵入的分布式追踪,并且也支持解析应用注入的唯一 Request ID 来解决这些问题 。Deepflow 的分布式追踪能力覆盖了所有服务,包括 SLB、微服务网关、Service Mesh 边车以及基础服务,并且支持 Java、Golang 等所有语言 。Deepflow 还支持调用 APM 的 Trace API,以及通过 Trace Completion API
将 eBPF 的追踪数据关联给 APM,也可以通过 OTLP 协议与 APM 互导追踪数据 。Deepflow 官方提供了一个使用 Spring Boot 开发的微服务应用示例,展示了其 AutoTracing 的能力,整个追踪过程无需手动插入任何追踪代码或注入任何 TraceID/SpanID 到 HTTP Header 中 。
零侵入的分布式追踪极大地降低了使用分布式追踪技术的门槛,使得开发人员可以专注于业务逻辑,而无需关心底层的追踪实现。全面的服务覆盖保证了追踪的完整性,不会留下任何盲点,从而能够更准确地诊断分布式系统中的问题。
4.3 任何函数的持续性能剖析
Deepflow 可以获取应用程序的函数调用栈快照,绘制任意进程的 CPU Profile,帮助开发者快速定位函数性能瓶颈 。函数调用栈中不仅包含业务函数,还可以展现动态链接库和内核系统调用函数的耗时情况。Deepflow 在采集函数调用栈时生成唯一标识,可以与调用日志关联,实现分布式追踪和函数性能剖析的联动。此外,Deepflow 还利用 cBPF 分析网络中的逐包数据,在低内核环境中绘制每个 TCP 流的 Network Profile,剖析建连时延、系统时延、服务响应时延和客户端等待时延,用于推断应用程序中性能瓶颈的代码范围 。
持续性能剖析能够在生产环境中以极低的开销运行,从而捕获那些间歇性的性能问题。函数级别的火焰图提供了非常详细的性能分析信息,帮助开发者精确定位到导致性能瓶颈的具体代码行。与分布式追踪的联动,使得性能分析能够与具体的请求上下文关联起来,从而更容易理解性能问题的根源。
4.4 与可观测性生态的无缝集成
Deepflow 秉持开放的态度,支持与主流的可观测性技术栈进行无缝集成,例如可以作为 Prometheus、OpenTelemetry、SkyWalking、Pyroscope 等的存储后端,并提供 SQL、PromQL、OTLP Export 接口作为 Grafana、Prometheus、OpenTelemetry、SkyWalking 的数据源 。Deepflow 的 AutoTagging 机制能够自动为所有观测信号注入统一标签,包括云资源、K8s 容器资源、K8s Label/Annotation、CMDB 中的业务属性等,从而消除数据孤岛 。
良好的集成能力使得用户可以在保留现有可观测性基础设施的同时,引入 Deepflow 的高级功能。统一的标签注入机制保证了来自不同数据源的数据能够被关联起来,从而实现更全面的分析和更深入的洞察。
4.5 高性能的数据存储
Deepflow 基于 SmartEncoding 机制,向所有观测信号注入标准化的、预编码的元标签,相比 ClickHouse 的 String 或 LowCard 方案可以将存储开销降低 10 倍 。自定义标签与观测数据分离存储,支持注入近乎无限维度和基数的标签,并获得类似 BigTable 的查询体验 。自 6.6 版本起,Deepflow 支持通过调整部署参数决定使用 ClickHouse 还是字节跳动基于 ClickHouse Fork 的 ByConity 作为其存储引擎,默认使用 ClickHouse 。ByConity 支持存算分离,能够进一步优化存储和计算资源的利用。
高效的数据存储是处理大规模可观测性数据的关键。SmartEncoding 机制显著降低了存储成本,并提升了查询性能。支持多种存储引擎的选择,为用户提供了更大的灵活性,可以根据自身的需求和偏好进行选择。
5. eBPF 及其他关键技术
Deepflow 的强大功能得益于其对一系列先进技术的巧妙运用,其中最核心的技术就是 eBPF。
5.1 eBPF:实现可观测性的关键技术
eBPF(Extended Berkeley Packet Filter)是一项革命性的 Linux 内核技术,它允许在内核空间安全高效地运行用户自定义的代码,而无需修改内核源码或加载内核模块 。Deepflow 广泛地利用 eBPF 技术,实现了对应用程序性能指标、分布式追踪和持续性能剖析等观测信号的零侵入式采集 。与传统的 APM Agent 相比,eBPF 程序无需修改应用程序代码,避免了运行时冲突和 SDK 的版本维护问题 。eBPF 的能力覆盖了从内核到用户程序的每一个层面,使得 Deepflow 能够跟踪一个请求从应用程序出发,经过系统调用、网络传输、网关服务、安全服务,最终到达数据库服务或对端微服务的全栈路径,从而提供充足的中立观测数据,快速完成故障的定界 。Deepflow 在网络通信领域的国际顶级会议 ACM SIGCOMM 2023 上正式发表了学术论文,详细介绍了其基于 eBPF 的网络中心分布式追踪技术 。
eBPF 技术的引入彻底改变了可观测性领域的格局。其非侵入式、高性能的特性,使得 Deepflow 能够在不对应用程序产生任何影响的情况下,获取底层的、全面的系统运行数据,这为解决复杂的性能问题和进行深入的系统分析提供了强大的支持。
5.2 Rust:高性能 Agent 的基石
为了在处理海量 eBPF/BPF 数据时能够消耗更低的资源,Deepflow 从 2021 年开始使用 Rust 语言重构 Agent 。Rust 具有极致的内存安全性和接近 C 的性能,尤其在内存消耗和 GC 方面相比 Golang 有显著优势,这使得 Agent 也适合运行于资源受限的环境,例如终端设备的 Android 操作系统 。
选择 Rust 作为 Agent 的实现语言,充分体现了 Deepflow 对性能和效率的极致追求。在高并发、大数据量的场景下,Agent 的性能直接影响到整个可观测性平台的稳定性和可靠性。Rust 语言的特性保证了 Agent 能够以最小的资源消耗,高效地完成数据采集任务。
5.3 WASM:灵活的协议扩展能力
Deepflow 利用 WebAssembly(WASM)技术,为用户提供了一种灵活的方式来扩展其协议解析能力 。虽然 Deepflow 内置了对许多常见应用协议的解析支持,但在实际应用中,用户可能需要解析一些自定义或私有的协议。通过 WASM 插件机制,开发者可以增强 Deepflow Agent 中的 ProtocolParser,从而提取自定义 JSON 结构中的错误信息,或者解码 Protobuf、Thrift 等序列化数据,甚至可以用于提取已有的分布式追踪标记作为 TraceID 。
WASM 插件机制为 Deepflow 带来了极高的灵活性和可扩展性。用户可以根据自己的特定需求,轻松地扩展 Deepflow 的协议解析能力,而无需修改 Deepflow 的核心代码。这使得 Deepflow 能够适应各种复杂的应用场景。
6. 使用 Deepflow 的优势与价值
使用 Deepflow 能够为用户带来诸多优势和价值:
- 消除手动代码插桩的负担: Deepflow 的零代码特性极大地简化了可观测性的实施过程,开发者无需修改代码或安装繁琐的 Agent 。这不仅节省了大量的时间和精力,还降低了引入错误的风险。
- 提供全栈的可观测性能力: Deepflow 基于 eBPF 的数据采集能够覆盖从应用程序到基础设施的各个层面,提供了对系统行为的全面洞察 。这弥补了传统 APM 工具在覆盖范围上的不足。
- 加速故障定位和根因分析: Deepflow 的全面数据采集和分析能力,使得用户能够更快地找到性能问题和错误的根本原因 。通过关联指标、追踪和性能剖析数据,用户可以更清晰地理解系统在故障发生时的行为 。例如,Deepflow 帮助用户快速定位了访问共享服务的 Top 客户端以及被忽视的背景压力 。
- 提升应用程序的性能和稳定性: 通过 Deepflow 提供的性能分析和瓶颈识别能力,开发和运维团队可以更有针对性地进行性能优化,从而提升应用程序的响应速度和整体稳定性 。持续性能剖析功能可以帮助在问题影响用户之前就发现并解决潜在的性能隐患 。
7. Deepflow 在字节跳动中的应用
Deepflow 由字节跳动开发并广泛应用于其内部的大规模基础设施和众多应用程序 。字节跳动长期以来对统一基础设施的建设,为其构建公司级的统一链路追踪系统奠定了有利的基础 。字节跳动资深架构师曾在 GOPS 2022 大会上分享了字节跳动在存储云原生改造及平台建设方面的实践经验 。此外,字节跳动大数据存储 SRE 技术负责人也在 GOPS 2023 上介绍了其在 10EB+ 数据量下的 HDFS 存储运维实践 。字节跳动内部的 Flow 团队也专注于 AI 应用的研发,这表明 Deepflow 可能也在其 AI 相关的项目中发挥着作用 。Deepflow 核心模块的开源,也体现了字节跳动对云原生生态的贡献和开放合作的态度 。Deepflow 项目在 GitHub 上拥有活跃的社区和贡献者 ,其开源目标是为复杂的云原生和 AI 应用提供深度可观测性 。
在如此规模和复杂度的环境中得到广泛应用,充分证明了 Deepflow 的可靠性和有效性。字节跳动在云原生和大数据领域的实践经验,也为 Deepflow 的持续发展和完善提供了强大的支持。
8. 结论
字节跳动的 Deepflow 是一款功能强大且高度自动化的可观测性平台,专为应对现代云原生和人工智能应用的复杂性而设计。通过其核心的 AutoMetrics、AutoTracing 和 AutoProfiling 功能,Deepflow 实现了对应用程序、网络和系统全栈的零代码可观测性。SmartEncoding 机制则保证了大规模数据的有效存储和查询性能。Deepflow 凭借其对 eBPF、Rust 和 WASM 等先进技术的巧妙运用,不仅解决了传统可观测性方案的诸多痛点,如 Agent 的侵入性和观测盲点,还为用户提供了更全面、更深入的系统洞察能力。作为源于并服务于像字节跳动这样的大型互联网公司的可观测性平台,Deepflow 已经在实践中证明了其价值和可靠性。其核心模块的开源,也预示着 Deepflow 将在未来的云原生可观测性领域发挥越来越重要的作用,并吸引更多的社区贡献者共同推动其发展。
表 1:Deepflow 不同版本的功能对比
功能特性 | 社区版 (Community Edition) | 企业版 (Enterprise Edition) | 云服务版 (Cloud Edition) |
---|---|---|---|
AutoMetrics | 支持 | 更强大 | 与企业版一致 |
AutoTracing | 支持 | 更强大 | 与企业版一致 |
AutoProfiling | 支持 | 更强大 | 与企业版一致 |
支持协议 | 常见应用和网络协议 | 更多协议(如 TLS、Oracle) | 与企业版一致 |
TCP 流重组 | 否 | 支持 | 与企业版一致 |
Off-CPU/内存/GPU 剖析 | 否 | 支持 | 与企业版一致 |
网络逐包时序图 | 否 | 支持 | 与企业版一致 |
云平台适配 | 基本支持 | 深度适配主流云平台 | 与企业版一致 |
高级分析特性 | 否 | 支持 | 与企业版一致 |
多租户支持 | 否 | 支持 | 与企业版一致 |
企业级服务 | 无 | 提供 | 与企业版一致 |
多区域管理 | 否 | 支持 | 与企业版一致 |
表 2:Deepflow 关键技术及其在平台中的作用
技术 | 描述 | 在 Deepflow 中的作用 |
---|---|---|
eBPF (Extended Berkeley Packet Filter) | Linux 内核中的一种革命性技术,允许安全高效地在内核空间运行用户自定义代码。 | 实现零代码的数据采集,用于指标、分布式追踪和性能剖析。 |
Rust | 一种系统编程语言,注重安全、性能和并发。 | 用于实现 Deepflow Agent,保证其高性能和内存安全性,适用于资源受限环境。 |
WASM (WebAssembly) | 一种为在 Web 浏览器和其他环境中运行高性能应用程序而设计的二进制指令格式。 | 提供插件机制,用于扩展 Deepflow 的应用协议解析能力,支持自定义或私有协议。 |