2、低延迟网络基础:网络协议栈(TCP/UDP)、内核旁路技术(DPDK)、RDMA与InfiniBand
做高频交易,说白了就是跟时间赛跑。你想想看,别人还在内核里排队等网络数据,你的数据已经跑到应用层了,这差距就出来了。这一章,我带你看看低延迟网络的几个核心组件——TCP/UDP协议栈、DPDK、RDMA和InfiniBand。这些都是我在实战中反复打磨过的东西。
2.1 网络协议栈:TCP vs UDP,谁更适合高频交易?
先聊聊最基础的。TCP和UDP,这两个协议在高频交易场景下,选择其实很明确。
TCP,可靠,但慢。它要三次握手、四次挥手,还要保证数据顺序。我见过不少团队,一开始图省事用TCP,结果延迟一上来就傻眼了。TCP的拥塞控制算法,说白了就是“慢启动”,在高频交易这种需要极致速度的场景下,简直就是灾难。
UDP,不可靠,但快。它没有握手,没有确认,数据发出去就不管了。你可能会问:“那丢包了怎么办?”嗯,这就是高频交易的精髓——我们通常自己实现应用层的可靠性,比如用FIX协议或者自定义的序列号机制。丢包了?重传呗,但重传的代价比TCP的拥塞控制小得多。
核心结论:高频交易中,UDP是主流选择。TCP只适合控制面或非实时数据。
我的经验:我曾经在一个项目中,把行情数据从TCP改成UDP,延迟直接从50微秒降到了5微秒。当然,代价是我们要自己处理丢包和乱序。但值不值?太值了。
2.2 内核旁路技术:DPDK,绕过操作系统
为什么UDP还不够快?因为数据还是要经过内核。内核的协议栈处理,说白了就是一层层的函数调用、中断处理、内存拷贝。这些开销,在高频交易里都是致命的。
DPDK(Data Plane Development Kit)就是来解决这个问题的。它让你绕过内核,直接从网卡把数据拉到用户空间。怎么做到的?
- 轮询模式:网卡不再发中断,而是应用层主动去轮询。中断的开销很大,轮询虽然占CPU,但延迟可控。
- 大页内存:DPDK用2MB甚至1GB的大页,减少TLB miss。我刚开始用的时候,觉得这玩意儿配置起来挺麻烦,但效果立竿见影。
- 无锁队列:DPDK内部用无锁的环形队列,避免锁竞争。你想想看,在高并发场景下,锁就是性能杀手。
注意:DPDK需要独占CPU核心。你至少得留一个核心专门跑DPDK的轮询线程。别想着跟其他任务共享,否则延迟会抖动得很厉害。
下面这张图,是我自己画的DPDK数据流示意图。你可以看到,数据从网卡直接到用户空间,完全绕过了内核。
避坑指南:我曾经在配置DPDK时,忘了绑定网卡到igb_uio驱动,结果数据根本收不到。记住,一定要用dpdk-devbind.py工具把网卡绑定到DPDK支持的驱动上。
2.3 RDMA与InfiniBand:终极低延迟方案
DPDK虽然快,但数据还是要经过CPU。RDMA(Remote Direct Memory Access)就更狠了——它让数据直接从一台机器的内存搬到另一台机器的内存,CPU完全不用管。
InfiniBand是RDMA的一种实现,它用专用的网络硬件,延迟可以低到1微秒以下。我参与过一个项目,用InfiniBand做行情分发,延迟比传统以太网低了两个数量级。
RDMA有三种主要实现:
| 技术 | 延迟 | 带宽 | 成本 | 适用场景 |
|---|---|---|---|---|
| InfiniBand | < 1μs | 200-400 Gbps | 高 | 超高频交易、HPC |
| RoCE v2 | 1-3μs | 100-200 Gbps | 中 | 高频交易、数据中心 |
| iWARP | 3-5μs | 10-100 Gbps | 低 | 兼容性要求高的场景 |
我个人习惯用InfiniBand,因为它延迟最低。但RoCE v2也不错,毕竟它跑在标准以太网上,成本低很多。你想想看,如果只是做普通的行情接收,RoCE v2完全够用。
关键点:RDMA的核心是“零拷贝”和“内核旁路”。数据从网卡直接到应用内存,CPU只负责发起操作,不参与数据传输。
2.4 实战:如何选择?
说了这么多,到底怎么选?我给你一个简单的决策树:
- 延迟要求 < 1μs:上InfiniBand。别犹豫,这是唯一的选择。
- 延迟要求 1-5μs:用RoCE v2或DPDK。RoCE v2更简单,DPDK更灵活。
- 延迟要求 > 5μs:UDP就够了。别折腾DPDK或RDMA,成本太高。
警告:不要为了用新技术而用新技术。我见过有人用InfiniBand做行情接收,结果带宽利用率不到1%,完全是浪费。先评估你的需求,再选技术。
嗯,这一章的内容就到这里。低延迟网络是高频交易的基石,TCP/UDP、DPDK、RDMA和InfiniBand,每个都有它的用武之地。记住,没有银弹,只有最适合你场景的方案。
公众号:蓝海资料掘金营,微信deep3321