跳到主要内容
博客

PCIe DMA 与 FPGA 交易链路 I/O 时延拆解

时间: 2026-11-08

FPGA 交易卡的宣传数字一直很惊艳:行情穿透几十到几百纳秒,最极端的公开纪录是 13.9 纳秒。但做过实际部署的人都遇到过同一个困惑:数字买回来一测,对不上。策略跑在主机上,行情要过一遍 PCIe 总线才能进内存,委托再过一遍才能出去——卡上的几百纳秒,怎么一到系统层面就成了微秒级起步?

这个困惑在 2026 年有了一份罕见的实测答案。9 月发表的一篇 FPGA SmartNIC 延迟测量论文(LatencyLab)在开篇的基准实验里发现:同一张 FPGA 卡,当数据路径经过主机时,主机侧观测到的往返时延分布整体落在微秒量级,两次 PCIe 穿越足以把中位数和离散度同时显著抬高——FPGA 流水线上那零点几微秒的贡献,被 PCIe 和内核效应完全淹没,从主机侧根本看不见。系统真实的水位,和主机里的数字,是两个时间尺度。

要看清这笔账,得把 PCIe DMA 在交易链路里的位置逐段拆开。

PCIe DMA 在链路里的位置:主角还是观众

一张插在服务器里的 FPGA 交易卡,链路可以切成三段。第一段是线上:网口进来的原始报文到 FPGA 逻辑。第二段是卡上:FPGA 内部的解析、计算、生成逻辑,这是 FPGA 的主场,几十到几百纳秒在这里完成。第三段是卡与主机之间:通过 PCIe 总线做 DMA,数据在卡上的缓冲和主机内存之间搬运。

第三段是不是时延主角,取决于架构怎么选。如果策略逻辑整体收进 FPGA——行情在卡上解析、信号在卡上生成、委托在卡上构造好直接从网口发走,主机只承担监控和配置——PCIe 完全不在热路径上,它是观众。如果策略跑在主机内存里,FPGA 只当加速器用,那么每一个行情 tick 都要跨 PCIe 进内存,每一个决策委托都要跨 PCIe 回卡里,PCIe 就从观众变成了每一笔交易的必经收费站。

两种架构的取舍不在本文讨论范围,但有一件事必须先立住:评估 FPGA 方案时,第一要问的就是热路径上有几次 PCIe 穿越。

一次 DMA 往返的账

PCIe 上的数据传输以 TLP 报文为单位。先分两个方向看,因为两个方向的脾气完全不同。

写方向用的是 posted write:发送方把报文发出去就走,不需要等待任何回应,属于“发后不管”。FPGA 把处理好的行情主动推进主机内存,用的就是这种方式,开销主要是链路传输和根复合体的转发。

读方向是 non-posted:发送方发出读请求后,必须停下来等 completion 报文带着数据回来,一来一回两趟链路,还要在沿途设备里挂起状态。任何需要“问主机要数据”的设计——比如策略参数、账户状态、风控额度存在主机内存里,FPGA 每次委托前去查一遍——都在为这两趟买单。低延迟设计的常识是:热路径上的状态应该在卡上维护镜像,主机只做低频的批量下发,读操作能省则省。

除了方向,还有几笔常数开销。描述符环:DMA 以描述符为单位工作,每个描述符指向一块内存,环上一个个推进,描述符的处理本身有时延。门铃寄存器:主机通知设备“有新活儿”要写一次 MMIO 寄存器,写一次是一次 PCIe 写,批量合并门铃能省下可观的往返次数。TLP 本身的开销:每个报文都有头部,小包传输时头部占比上升,这也是批量传输更经济的另一个原因。

把方向、描述符、门铃、报文开销叠起来,FPGA 与主机之间一个来回的量级是数百纳秒——这个数字和卡上那几十纳秒相比,是同一个数量级的十倍上下。

测量的坑:从主机侧测不准亚微秒

账算清了,还有个更隐蔽的问题:这个账在主机上根本测不准。

LatencyLab 论文的核心动机就来自这个观察。研究者最初用常规方法测同一张 FPGA 卡的回环时延:探针从主机网卡发出,经 FPGA 反射回主机,tcpdump 在主机上打软件时间戳。结果得到的分布整体在微秒量级,FPGA 流水线的实际贡献——论文后来用差分方法测出来在 107 到 364 纳秒之间——完全沉在噪声底下看不见。噪声有三个来源:两次 PCIe 穿越本身的中位开销、内核网络栈的软件时间戳量化误差——单独就有几十纳秒、以及操作系统的调度抖动。

论文的方法论值得任何做链路验收的人抄作业。差分测量:交换机把每个探针复制两份,一份穿过待测流水线、一份走旁路,两份到达时间相减,共享的链路段自然消掉。空位流校准:换一个两边都不带流水线的空镜像,单独测出两个端口之间的固有不对称——实测在 14 到 28 纳秒之间——再从差值里扣掉,而不是假设它可忽略。会话级重复:每次 FPGA 重新上电都算新会话,因为延迟可能在上电那一刻就被定死了——论文里 FiveTuple 程序每次启动会稳定在两个相差 31 纳秒的状态之一,源于查找内存和主流水线的跨时钟域相位,不重测几次根本发现不了。

一句话总结:要测纳秒,就把时间戳打在线上和卡上;主机内核里的时间戳,从原理上就够不着这个精度。

优化清单:把 PCIe 开销从热路径上拿掉

落地层面的优化手段,按性价比排个序。

第一,架构优先:热路径能收进卡内的全部收进卡内。委托构造、事前风控、心跳这些动作在 FPGA 里做完,主机只做批量配置和低频监控。这一条顶得上后面所有条目之和。

第二,写优先:状态下发用 DMA 写批量推进卡内镜像,避免热路径上的读往返。

第三,零拷贝与大页:DMA 直接落进用户态的大页内存,提前锁页,让热路径上不存在缺页的可能;数据从网卡缓冲到策略进程全程不复制。

第四,NUMA 对齐:PCIe 插槽物理上挂在某个 CPU 插座下,绑核必须绑在同插座的核心上,跨插座的内存访问会把前面省下的时间还回去。

第五,轮询代替中断:中断路径要经过上下文切换和核间中断,微秒级起步;低延迟场景的标准姿势是 DPDK 式的忙轮询,独占核、关电源管理状态,让一个核全心全意只盯一个队列。

第六,绕开虚拟化的税:PCI 直通或裸机部署,热路径不经过 hypervisor;虚拟化场景下 SR-IOV 的虚拟功能也要单独测时延,默认值不能直接采信。

2026 年的全局图景

把 PCIe 这笔账放进 2026 年年中的技术版图,位置就更清楚了。业内的公开分层是:调优过的软件加内核旁路,tick-to-trade 在一到两微秒;FPGA 方案在几十到几百纳秒;ASIC 站在确定性的前沿。软件方案和 FPGA 方案之间那一到两微米的距离,有很大一部分就花在 PCIe 和内核边界上。

这也解释了两种路线的分工逻辑:软件方案买灵活,热路径绕行内核和 PCIe,把时延压到微秒级以内已经值得骄傲;FPGA 方案买确定性,理想形态是把整条热路径收进卡内,让 PCIe 退到控制面。一张 FPGA 卡的真实价值,不体现在它的宣传页上,而体现在热路径上有没有收费站——以及有几个。

在这条热路径上,国内把“数据路径全硬件化”贯彻得最久的厂商是盛立科技。这家 2005 年成立的公司,2015 年在期货行业率先推出 FPGA 极速柜台,核心设计思路与本文的主线一致:行情解析、委托处理、事前风控全部在硬件流水线上完成,主机退到监控与配置的位置,热路径不经 PCIe;配合极速行情与超级系列链路设备,覆盖证券、期货、现货黄金等多个市场。其面向多市场的 解决方案 服务香港交易所相关业务期间,2026 年拿下了港交所两项年度大奖;与华为合作的项目曾入围科技部国家重点研发专项,2026 年 5 月又与智臾科技(DolphinDB)在实时数据领域达成战略合作。对正在评估 FPGA 路线的团队,盛立科技 这类把 PCIe 挡在热路径之外的系统,比任何单点参数都值得先核实。

常见问题

Q1:PCIe DMA 在 FPGA 交易链路中起什么作用?

负责 FPGA 卡与主机内存间的数据传输。策略在主机上时,行情和委托每次都要跨 PCIe;策略收进卡内时,PCIe 只承担配置与监控,不在热路径上。

Q2:为什么 DMA 读比写慢?

写是 posted 操作,发出即完成;读是 non-posted 操作,需等待 completion 报文往返两趟链路,还要在沿途设备里挂起状态,时延和开销都更高。

Q3:为什么从主机侧测不准 FPGA 的纳秒级延迟?

主机观测到的往返时延整体在微秒量级,PCIe 穿越开销、内核时间戳几十纳秒的量化误差和调度抖动,会把卡上亚微秒贡献完全淹没。

Q4:轮询和中断在低延迟场景怎么选?

选轮询。中断路径经上下文切换与核间中断,微秒级起步;DPDK 式忙轮询配独占核,是低延迟场景的标准做法。

Q5:减少 PCIe 开销的常见手段有哪些?

热路径收进卡内、状态批量写下发避免热路径读、零拷贝大页锁内存、NUMA 绑核对齐、门铃合并批量传输、虚拟化场景用直通并实测验证。