为什么快
介绍
框架内部消息传输层采用了 Aeron + SBE 组合,真.零拷贝、零回环、零反射、零GC、零运行时解析、编解码开销几乎为零。 通过无锁 (Lock-Free) 设计和零 GC (Zero-GC) 策略, 能够实现亚微秒甚至纳秒级别的端到端延迟,特别是在进程间通信 (IPC) 时,它的性能几乎可以达到底层硬件的极限。
共享内存 (Aeron IPC)
Aeron 独特的 IPC 机制,基于共享内存 (Shared Memory) 和无锁设计,这从根本上消除了数据在不同进程间传输时产生的拷贝和上下文切换开销。
Aeron IPC 与 Netty Zero-Copy 的区别
| 特性 | Netty 系统级零拷贝 | Aeron 应用级零拷贝 (IPC) |
|---|---|---|
| 传输介质 | 内核缓冲区、网络协议栈 | 共享内存文件 (Mapped Files) |
| 数据流转 | 减少用户空间到内核空间的复制,但仍涉及内核网络栈。 | 完全绕过内核、网络协议栈和用户空间之间的复制。 |
| 零拷贝定义 | 减少系统调用过程中的 CPU 复制。 | 跨进程、完全消除数据拷贝。 |
Aeron 会在底层开辟一块内存区域(Log Buffer),让不同进程同时指向这块内存。 通过让多个进程映射同一块内存,数据在进程间传递时不需要经过内核、网络堆栈或用户空间之间的任何复制。这是一种更彻底、更高维度的零拷贝。
下图中有两个进程,分别指向了同一块内存。 这块内存是可复用的循环缓冲区(由 Term Buffers 构成),以避免 GC。内存复用是 Aeron 高性能的关键所在。
循环缓冲区完全避免了在数据传输过程中频繁地分配和释放内存,从而极大地减少了 JVM 的垃圾回收(GC)压力和停顿,保证了极低的延迟。
这样设计的优点是:
- 延迟方面: 极低。避免了网络协议栈和上下文切换的开销,通常在 纳秒/微秒 级别。
- 传输方式: 由于多个进程映射同一块内存,数据在进程间传递时实现零拷贝传输。
- 开销方面: 从根本上消除了数据在不同进程间传输时产生的数据拷贝和上下文切换开销。
SBE (Simple Binary Encoding)
Aeron 和 SBE 常常是搭配使用的“最佳组合”,它们共同为高吞吐量、低延迟的应用提供了端到端的最优解决方案。
SBE 是一个用于高性能金融和交易应用的消息编码/解码标准,它的核心目标是在实现极低延迟的同时,达到极致的 CPU 效率。 SBE 的设计完全是为了机器效率,而非人类可读性。它摒弃了 XML、JSON 或 Google Protobuf/Thrift 等常见的编码格式中存在的“不必要”开销。
特点:
- 极致的 CPU 效率: SBE 的编码和解码过程几乎是零 CPU 开销。它采用被称为 “在位编解码 (On-the-wire Encoding/Decoding)” 的机制。
- 固定内存布局: 字段大小固定,整个消息的结构和字段的内存偏移量在编译时已确定,编解码开销几乎为零。
- 零 GC: 内存开销极小,无临时对象,完全避免在编解码过程中产生新的 Java 对象。
SBE 性能极快,编解码延迟处于纳秒级。得益于其固定内存布局,性能通常是 Google Protobuf 等基于运行时解析的框架的数倍。在单核上,SBE 每秒可轻松处理数千万条消息,展示了其极致的 CPU 效率。
时间换算与延迟性能指标
为了清晰衡量性能,我们首先回顾时间单位:
| 单位 | 关系 | 描述 | 换算 |
|---|---|---|---|
| 纳秒 (ns) | 10-9 秒 | 十亿分之一秒 | 1秒 (s) = 1,000,000,000 纳秒 (ns) |
| 微秒 (us) | 10-6 秒 | 百万分之一秒 | 1微秒 (us) = 1,000 纳秒 (ns) |
| 毫秒 (ms) | 10-3 秒 | 千分之一秒 | 1毫秒 (ms) = 1,000 微秒 (us) |
| 秒 (s) | 1秒 (s) = 1,000 毫秒 (ms) |
Aeron 延迟性能指标
-
进程内/间通信 (IPC):
- 延迟: 纳秒级延迟(~100 ns 级别)。
- 机制: 通过无锁、基于共享内存的环形缓冲区实现,彻底避免了内核态切换和锁竞争,这是达到极低延迟的关键。
-
局域网通信 (UDP):
- 延迟: 微秒级延迟(~10 - 30 us 级别)。
- 机制: 使用应用层优化的 UDP 协议,提供可靠性和有序性,显著优于传统内核 TCP/IP 协议栈。
对比: 传统 TCP/IP 通信的基准延迟通常在毫秒 (ms) 级别,Aeron 在 LAN 上的延迟优势是数量级的。
Aeron UDP 与传统 TCP/IP 的关键差异
Aeron UDP 协议与传统内核 TCP 协议的设计哲学完全不同
- 传统 TCP/IP 旨在提供一个通用、可靠、公平的广域网传输层,但以牺牲延迟的稳定性和可预测性为代价。
- Aeron 则是一个专注于低延迟、高吞吐、延迟可预测的消息流传输框架。它将复杂的传输逻辑移动到应用层,并通过共享内存 (IPC) 和优化后的 UDP (应用层可靠性) 绕过了内核 TCP/IP 栈的性能瓶颈。
- 使用 Aeron,开发者获得了对延迟和传输行为的精细控制,从而实现极低且高度可预测的通信延迟。
| 特性 | Aeron (UDP/应用层) | 传统 TCP/IP (内核/传输层) |
|---|---|---|
| 可靠性机制 | NACK 机制:只有接收方发现缺失时才请求重传。效率高,流量小。 | ACK 机制:发送方需等待确认,增加延迟和网络流量。 |
| 有序性保障 | 应用层处理:乱序接收,在接收端日志中进行有序重组。 | 内核层保证:所有数据包必须顺序交付。 |
| HoL 阻塞 | 消除 (No Head-of-Line Blocking)。 即使有丢包,后续数据仍可被接收和缓冲,不影响处理流水线。 | 存在 (TCP)。 丢包会导致后续所有数据包停滞在内核缓冲区,等待重传完成,显著增加 P99 延迟。 |
| 背压/流控 | 应用层流控 (如 Term Offset/Position),快速且细粒度,反应迅速。 | 内核滑动窗口/流控,受限于操作系统调度,反应相对滞后。 |
小结
网络编程性能的两个关键点分别是数据传输和编解码。得益于 Aeron 和 SBE 组合,我们解决了这两个关键瓶颈:
- Aeron 负责高效消息传输: 极低的传输延迟,IPC 为零拷贝,网络传输优于传统 TCP/UDP。
- SBE 负责高效编解码: 极低的 CPU 占用,编解码过程零拷贝、零解析。
最终收益
- SBE = 极致的 CPU 效率,它让消息处理的速度达到硬件极限。
- Aeron + SBE = 端到端的性能保障。
- 零 GC / 零拷贝: SBE 直接在缓冲区操作,Aeron 在共享内存中传输,共同实现了高性能应用梦寐以求的零内存复制和零垃圾回收的目标。