背景:为什么要优化 Turbine 上的 shred 路径
在 Solana 网络中,负责出块的 leader 以很短的周期轮换,通信的起点始终在移动。无论是 RPC 节点还是 Geyser gRPC 节点,它们最终的速度都取决于"节点能多快地抓取到一个区块"。而区块由 shred 组成,通过 Turbine 协议在验证者节点之间传播。因此,优化的关键就落在"Turbine 上 shred 的传播与摄取路径"上。
XDP(eXpress Data Path)与 AF_XDP zero-copy 正是面向这一阶段的优化,它们在 Solana v4(Agave 4.x)中可用。
XDP 与 AF_XDP zero-copy 是什么
XDP 是 Linux 内核的一项技术,它让高性能网络代码能够绕过内核常规数据包处理路径中的很大一部分。通过减少数据拷贝与上下文切换,它以远低于标准网络栈的开销来处理数据包。
在 Agave(Solana 的验证者客户端)中,XDP 被应用到 Turbine——即在验证者节点之间传播区块的协议。接收到的 shred 由一个挂载在网卡(NIC)附近的 eBPF 程序处理,并通过 AF_XDP 映射到用户态缓冲区。当启用 zero-copy 模式时,接收到的数据无需从内核态向用户态拷贝即可直接交付。对于发送方向的 shred,同样利用 AF_XDP 的发送路径,减少热路径上的拷贝与系统调用开销。
Anza 在 Agave 3.x 系列(v3.0.9 起)为 Turbine 引入了 XDP,并将其延续到 Solana v4(Agave 4.x)的基础之中。启动参数也在历次发布中逐步整理:Agave 4.1 系列弃用了 --experimental-retransmit-xdp-* 系列参数,并整理为 --xdp-interface / --xdp-cpu-cores / --xdp-zero-copy。
对 Geyser gRPC 节点的作用:加快源端摄取
Geyser gRPC 是以流(stream)而非轮询方式接收账户、slot、区块与交易更新的通道。这里一毫秒的差异,直接关系到对执行机会的捕捉与前端的体感速度。Geyser 的延迟最终取决于"源端能多快地抓取到区块"。
XDP 与 zero-copy 恰好降低了源端 shred 传播与摄取路径的开销。源端能够更快地接收并传播 shred,就能在更早的阶段观测并重建区块,从而缩短这些更新经由 Geyser gRPC 流到达使用者的延迟。
对 RPC 节点的作用:提升 state 的新鲜度
RPC 节点同样通过 Turbine 接收构成区块的 shred,并更新自身的账本与 state。当 XDP 与 zero-copy 降低了这一基于 Turbine 的 shred 摄取与传播开销时,RPC 节点就能更早地摄取较新的区块。
对使用 RPC 的场景而言,这并不是说所有 RPC 方法都会一律变快,而是体现为节点所持有 state 的新鲜度。当你查询最近的 slot、区块或某个账户的最新状态时,节点已摄取的信息越新,响应中数据的新鲜度就越高。此外,传播与摄取路径开销的降低,也意味着节点在高负载下有更多余量去处理更新而不至于丢弃。
在所有区域的生产节点上启用所面临的工程挑战
启用 XDP 需要较为高级且容易出错的调优:较新的内核、支持 XDP 的网卡、为验证者进程配置正确的 systemd capabilities、正确的启动参数,以及恰当的 CPU 核心绑定(pinning)。要把它部署到所有区域的生产节点,并针对每个区域不同的网卡、内核与网络配置逐一验证,运维难度会进一步上升。
这一优化的运维知识可以沉淀为开源 Solana 运维工具中的一份可复现配方(recipe)。从 XDP 的启用(如 xdp_enabled / xdp_zero_copy 等配置变量),到配信延迟的测量(slv check geyserbench),都可以以可复现的形式提供,通过 CLI 即可重现。
用自己的数值来验证
这一优化能带来多大差异,取决于连接来源、路径、时段以及 leader 的分布。因此,比起固定的数值,更值得关注的是测量方法本身。
对于 Geyser gRPC,可以用 slv check geyserbench --kind grpc 做 first-arrival 比较,用 slv check grpc 做单个端点的连通性与延迟检查,在贴近自身工作负载的条件下进行对照。对于 RPC,则建议用自己的 bot 或应用实际发出的请求,从同一连接来源去测量返回数据的新鲜度与响应表现。
基于自己测得的数值来做判断,而不是依赖外部主张,这正是注重 first-arrival 性能的工程实践的出发点。