2. 测试环境搭建:硬件选型与系统调优

做高频交易压力测试,环境搭建是地基。地基不稳,后面测出来的数据全是噪音。我见过太多团队,花大价钱买了服务器,结果因为网卡中断没绑好,延迟直接翻倍。今天咱们就把这块掰开揉碎了讲。

2.1 硬件选型:CPU、内存、网卡

硬件选型这事儿,说白了就是找短板。高频交易系统里,CPU、内存、网卡这三样,哪个都不能拖后腿。

CPU:主频比核数重要

我个人习惯,选CPU先看主频。高频交易策略大多是单线程的,或者线程数很少。你想想看,一个订单从生成到发出,中间就几百纳秒的窗口期,核再多,主频上不去也是白搭。

  • 主频:建议4.0GHz以上。我测试过,3.5GHz和4.5GHz的CPU,同样一个策略,延迟能差出30%。
  • 核心数:8核足够。别贪多,核多了反而要处理NUMA问题,麻烦。
  • 缓存:L3缓存越大越好。我遇到过一回,策略里有个查表操作,L3缓存小了,频繁缺页,延迟直接飙到微秒级。

内存:容量够用就行,频率要快

内存这块,容量不是重点。高频交易系统里,数据都是实时流式处理的,不会在内存里囤积大量历史数据。重点是内存频率和时序。

参数 推荐值 说明
容量 32GB - 64GB 够用就行,多了浪费
频率 DDR4-3200 或更高 频率越高,内存访问延迟越低
时序 CL14 或更低 时序越低越好,CL16和CL14差距明显
我的经验:内存插法也有讲究。双通道比单通道好,但别插满所有槽。插满时内存控制器压力大,反而会降频。我一般只插两根,留两个空槽。

网卡:低延迟是硬指标

网卡是高频交易系统的咽喉。普通千兆网卡就别想了,延迟太大。我建议直接上Solarflare或Mellanox的网卡,支持硬件时间戳和用户态协议栈。

  • 型号:Solarflare SFN8522 或 Mellanox ConnectX-5
  • 速率:10Gbps起步,25Gbps更好
  • 特性:必须支持DPDK或OpenOnload
注意:网卡固件版本很重要。我曾经踩过一个坑,某款网卡默认固件里有个节能模式没关,导致中断延迟忽高忽低。后来刷了低延迟固件才解决。

2.2 操作系统调优:内核参数与中断绑定

硬件选好了,操作系统也得伺候好。Linux内核默认是为通用场景优化的,对高频交易来说,很多默认参数都得改。

内核参数调优

这部分我直接给配置。你照着抄就行,但最好理解一下每项是干嘛的。

# /etc/sysctl.conf 追加以下内容

# 减少TCP连接的超时时间
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_reuse = 1

# 关闭TCP的Nagle算法,减少小包延迟
net.ipv4.tcp_nodelay = 1

# 增大网络缓冲区
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728

# 关闭CPU节能模式
kernel.nmi_watchdog = 0
kernel.sched_rt_runtime_us = -1

# 内存大页支持
vm.nr_hugepages = 1024

为什么这么配?我简单解释一下。TCP的TIME_WAIT状态,在高频交易里是个大麻烦。你想想看,每秒几千笔订单,每个连接都卡在TIME_WAIT里,端口很快就耗尽了。所以我把超时时间压到1秒,并且允许复用。

核心思路:所有调优的目标只有一个——减少不确定性。内核的默认行为里,有很多「公平」机制,比如CPU时间片轮转、中断均衡。这些在高频交易里都是敌人。

中断绑定:把网卡中断钉在指定CPU上

这是我最看重的一步。默认情况下,网卡中断会在所有CPU之间轮转。这会导致CPU缓存频繁失效,延迟抖动很大。

我的做法是:把网卡中断绑定到专用的CPU核心上,这个核心不跑任何其他进程。

# 查看网卡中断号
cat /proc/interrupts | grep eth0

# 假设中断号是 130-137,绑定到 CPU 2 和 3
echo 0x0c > /proc/irq/130/smp_affinity
echo 0x0c > /proc/irq/131/smp_affinity
# ... 以此类推

这里0x0c是二进制1100,表示CPU 2和3。为什么绑两个?因为一个CPU处理中断,另一个CPU处理应用逻辑,这样能避免中断处理和应用逻辑争抢CPU。

避坑指南:我曾经犯过一个错,把中断绑到了CPU 0上。结果系统时钟中断也在CPU 0上,两者冲突,导致网络延迟偶尔飙升到几十微秒。后来我把中断绑到了CPU 2和3,问题就解决了。

2.3 低延迟网络环境配置

网络环境这块,很多人只关注带宽,忽略了延迟。其实在高频交易里,延迟比带宽重要得多。你想想看,一个订单从上海到北京,光纤来回也就10毫秒,但中间经过的交换机、路由器,每跳都会增加几十微秒的延迟。

网络拓扑:越简单越好

我建议用直连拓扑。如果条件允许,交易服务器和交易所网关之间不要经过任何交换机。直接光纤对接,延迟最低。

  • 直连:服务器网卡直连交易所网关,延迟最低
  • 一级交换:如果必须用交换机,选低延迟型号(如Arista 7130系列)
  • 避免:防火墙、负载均衡器、IDS等设备,它们会引入不可控的延迟

用户态协议栈:绕过内核

Linux内核的网络协议栈,为了通用性,做了很多不必要的处理。比如数据包从网卡到应用,要经过中断处理、协议解析、socket缓冲区拷贝等,每一步都有延迟。

解决方案是用用户态协议栈,比如DPDK或OpenOnload。它们让应用直接操作网卡硬件,绕过内核。

# 使用OpenOnload加速TCP连接
export ONLOAD_ACCELERATED=1
export ONLOAD_CPUS=2,3

# 启动你的交易程序
./trading_app

用上OpenOnload后,TCP延迟能从几十微秒降到几微秒。我测试过,效果非常明显。

时钟同步:PTP协议

高频交易里,时间戳的精度至关重要。NTP协议只能到毫秒级,不够用。必须用PTP(Precision Time Protocol),精度能到纳秒级。

协议 精度 适用场景
NTP 1-10毫秒 普通应用,不适用高频交易
PTP 100纳秒 - 1微秒 高频交易,必须使用
注意:PTP需要硬件支持。网卡和交换机都必须支持PTP硬件时间戳。纯软件实现的PTP精度不够,别省这个钱。

2.4 知识体系总览

下面这张图,是我画的环境搭建知识体系。你可以把它当作一个检查清单,每项都确认到位了,再开始压测。

测试环境搭建知识体系 硬件选型 操作系统调优 网络环境配置 CPU:主频优先,8核足够 内存:频率高,时序低 网卡:Solarflare/Mellanox 内核参数:关闭节能、调大缓冲区 中断绑定:专用CPU处理中断 大页内存:减少TLB miss 拓扑:直连或一级交换 协议栈:DPDK/OpenOnload 时钟同步:PTP硬件时间戳 核心目标:消除一切不确定性,降低延迟抖动 每一微秒的优化,都可能决定交易的成败

嗯,环境搭建这块就这些。硬件选型别贪便宜,操作系统调优别偷懒,网络配置别图省事。这三样都做到位了,你的压力测试结果才有参考价值。

专注资料整理