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核心上,这个核心不跑任何其他进程。
# 查看网卡中断号
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。
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微秒 | 高频交易,必须使用 |
2.4 知识体系总览
下面这张图,是我画的环境搭建知识体系。你可以把它当作一个检查清单,每项都确认到位了,再开始压测。
嗯,环境搭建这块就这些。硬件选型别贪便宜,操作系统调优别偷懒,网络配置别图省事。这三样都做到位了,你的压力测试结果才有参考价值。