交易系统下单链路的时延要求没有统一固定值,核心取决于交易策略类型与业务容灾目标:普通散户行情触发的程序化交易可接受毫秒级,而高频做市商需要微秒级,量化私募与券商柜台则通常以“穿透时延P99≤10ms”为基准线。
先分清业务场景:不同角色对时延的容忍度完全不同
定下单链路时延,第一步不是看技术指标,而是问业务方“你拿这个系统做什么”,同一套系统,现货套利和日内趋势策略对延迟的敏感度能差三个数量级。
- 高频做市与跨所套利:这类策略靠微小的价格差获利,订单在交易所撮合引擎的排队位置往往决定胜负,业内专家指出,此类场景下单链路的目标通常设定在微秒级(10μs-100μs),且关注的是端到端极值而非平均值。
- 中频量化与算法拆单:持仓周期从几分钟到几小时,策略依赖分钟级K线和订单流特征,这类系统能容忍毫秒级延迟,但要求延迟抖动小,P99时延稳定在10ms以内即可。
- 普通程序化跟单与手工辅助:用户感知不到20ms以内的差异,此时时延要求可以放宽到50ms-100ms,优先保证吞吐量和稳定性,降低硬件成本。
行业共识认为,不要为了追求极致低延迟而过度设计,百万级资金的中频策略,花重金配置FPGA和内核旁路,带来的收益提升往往覆盖不了硬件投入。
高频交易下单时延要求:如何测量才算数
时延指标容易造假,因为测量点不同,结果能差几十倍,行业里经常看到两类数据冲突一家说“微秒级”,另一家说“毫秒级”,其实都没错,只是口径不同。
穿透时延与局部时延的区别
- 穿透时延:从策略信号产生到交易所返回确认的全部耗时,这是业务真正关心的数字,也是下单链路时延要求的基准。
- 局部时延:比如仅测行情解析耗时,或仅测网络RTT,这类数据用于定位瓶颈,但不能作为对外承诺的指标。
测量必须覆盖三个关键阶段
- 策略计算:信号生成时间,包含因子计算与风控校验。
- 订单编码与发送:从内存中的订单结构体转为网络报文,再经TCP或UDP发出。
- 交易所确认返回:包括网络往返和交易所处理延迟,这部分通常占据总耗时的60%-70%。
测量方法上,推荐在应用代码里打高精度时间戳(使用clock_gettime(CLOCK_MONOTONIC)

),同时用硬件交换机端口镜像抓包做交叉验证,只用软件打点容易漏掉内核协议栈排队延迟,只用抓包又难以对应到具体策略信号。
常见性能测试指标:P50、P99与最大值
- P50:代表典型时延,用于日常监控。
- P99:代表最差的尾部延迟,直接决定策略是否会出现漏单或超时撤单。定标时优先看P99,而非平均值。
- 最大值:通常是垃圾回收暂停、网络重传等异常事件导致,建议单独告警,不纳入正常要求基准。
证券交易系统性能测试指标的表单中,务必同时记录以上三个值,并且注明交易所环境是模拟盘还是生产环境、是否开启行情压缩、是否经过同城跨机房专线,没有这些上下文,任何数据都无意义。
交易系统下单延迟标准怎么定:从业务目标倒推技术指标
很多团队一上来就定“全链路小于1ms”,结果硬件换了三套也达不到,最后只能改成“小于10ms”,正确的做法是从业务损失反推预算。
第一步:量化延迟成本
问策略团队:“如果一笔订单晚到5ms,预期损失是多少?”常见计算思路:
- 基于历史行情回放,模拟不同延迟下订单成交价差的变化。
- 对做市策略,延迟每增加1ms,库存风险敞口暴露时间变长,对应的预期亏损额即延迟成本。
- 对套利策略,延迟增加可能导致另一条腿已成交而本腿滑点扩大,这部分代价也要计入。
第二步:设定性能预算表
将总时延目标拆解为各环节预算,例如目标穿透时延10ms(P99):
| 环节 | 预算 | 占比 |
|---|---|---|
| 策略信号计算 | 2ms | 20% |
| 风控检查 | 1ms | 10% |
| 订单编码与发送 | 1ms | 10% |
| 网络RTT(同机房) | 3ms | 30% |
| 交易所撮合等待 | 3ms | 30% |
注意第三行交易所撮合等待不是我们能控制的,但有时需要留出重传空间,实际定标时,将网络RTT和交易所等待合并为“外部固定开销”,内部环节总预算不超过4ms。
第三步:预留20%的余量
硬件性能波动、行情冲击瞬时爆发、系统GC压力都会让P99恶化,将目标值乘以2作为最终要求,比如业务测算需要8ms,那就定10ms;需要2ms,就定2.5ms,否则后期任何小调整都会导致指标超标。

期货交易系统时延优化方案:从三个层次动手
如果实际测试结果不达标,按投入产出比排序来优化,不要一上来就换硬件。
应用层优化(成本最低)
- 减少序列化开销:用扁平数据结构替代嵌套对象,避免JSON/Protobuf反射。
- 池化连接与对象复用:每次下单新建Socket或Socket写入对象都会造成GC压力。
- 预计算交易参数:将合约乘数、保证金率等常量提前加载到内存,运行时直接查表。
- 使用无锁队列:策略线程与发送线程之间用
Disruptor或LMAX RingBuffer传递订单,避免锁竞争。
网络层优化(性价比高)
- 启用TCP_NODELAY:关闭Nagle算法,避免小报文延迟。
- 调整内核net.core.netdev_budget:高吞吐下增加网络软中断处理预算。
- 使用DPDK或Solarflare Onload:绕过内核协议栈,可减少40%-60%的网络路径耗时。
- 同机房部署:如果交易所支持机房托管,将应用服务器放入同一IDC,网络RTT能从毫秒级降到微秒级。
硬件与架构优化(投入大)
- FPGA硬件行情解析:适用高频场景,将行情解码延迟压缩到亚微秒。
- CPU绑核与隔离:将处理下单的线程绑定到专用物理核,并关闭CPU调频与超线程。
- 内存数据库替代磁盘存储:订单状态管理使用Redis或自研共享内存,避免落盘延迟。
以某期货公司的商品交易系统为例,仅通过启用TCP_NODELAY、调整net.ipv4.tcp_fastopen参数,以及将风控规则从数据库查询改为本地缓存,穿透时延就从18ms降至7ms,硬件零支出。
下单链路时延测试的具体执行步骤
定完标准后,需要建立可靠的验证流程,否则标准形同虚设。
准备测试环境
- 使用与生产一致的服务器配置、网络拓扑和交换机型号。
- 构造标准行情快照和订单流,模拟高峰时段的撮合压力。
- 在应用服务器、数据库、交易所模拟器分别部署时钟同步(NTP或PTP),并校验时间偏差小于1ms。
执行压测脚本
参考命令伪代码:
# 模拟下单客户端,连续发送100万笔限价单,记录每笔的返回时间 ab -n 1000000 -c 10 -k https://交易网关/order # 或使用自研脚本,在每个请求前后记录CLOCK_MONOTONIC差值
注意并发度要分多档:1、10、100、1000,高频系统在低并发下延迟最漂亮,但高并发下的P99才是真正指标。

分析瓶颈
- 如果延迟随并发线性增长,优先查数据库连接池和业务线程池。
- 如果延迟出现周期性尖峰,怀疑GC暂停或定时任务抢占。
- 如果P99与P50差距过大,检查内核网络缓冲区是否有丢包重传。
两个常见争议问题:要不要追求极值,如何应对行情突发
有些团队在定标时走入两个极端,一是觉得“越快越好”,把所有环节都换成最高配,结果投入产出比极低,二是只看平均时延,忽略P99,结果行情剧烈波动时订单大量超时。
收敛策略
对绝大多数非高频场景,P99≤10ms已足够支撑日频、分钟级甚至秒级策略,只有做市和超短线套利才需要微秒级,可以分阶段执行:先满足P99≤10ms,运行一个月后结合策略实际成交滑点,再决定是否需要专项优化。
应对行情突发的时序冲击
行情瞬时报单量放大时,链路前排队的报文数量会暴增,建议设置两级限流:应用层基于令牌桶限制每秒最多下单量;网络层通过SO_RCVBUF和qdisc队列长度控制突发流量,同时监控线程池队列深度,一旦超过阈值立即丢弃非关键任务,保证交易核心路径不被拖垮。
下单链路时延常见问题答疑
如何判断自己系统的时延要求是10ms还是1ms?
看策略持仓周期和单笔盈利预期,如果持仓超过1分钟,单笔盈利大于一个tick,10ms完全够用,如果持仓只有几秒,且盈利依赖排队优先权,才考虑1ms以下,另外查看交易所的行情快照频率如果推送周期是500ms,那么10ms和1ms对策略信号影响差异不大。
用模拟盘测出的延迟数据能代表生产环境吗?
不能直接代表,模拟盘的撮合引擎往往在同一机房,网络RTT远低于生产环境跨机房专线;而且模拟盘没有真实的市场冲击和对手方订单流,撮合排队时间会被低估,建议在生产环境夜间低峰时段,用只读账号挂一个极低价格的限价单进行实测,测完立即撤单,注意不要影响真实交易。
服务端性能好,但客户端软件本身会不会拖慢下单?
会,而且这是最容易被忽略的环节,很多量化框架的行情解析线程与下单线程共用同一个事件循环,行情堆积会阻塞订单发送,检查你的客户端代码是否将行情处理与交易指令分离,发送订单是否通过独立线程或独立连接,如果两端性能指标都达标但实测延迟仍高,优先怀疑应用层线程模型,而非中间件。