3、测试环境搭建:硬件选型与系统调优
做量化交易系统性能测试,最怕什么?
我最怕的是:测了半天,结果根本不准。不是系统不行,是环境搭得有问题。你想想看,硬件选错了、操作系统没调优、网络拓扑有瓶颈、时钟不同步——这些坑随便踩一个,你的基准测试数据就废了。
这一章,我就把搭建测试环境的经验掰开揉碎了讲。咱们从硬件选型开始,一步步来。
3.1 硬件选型:别在刀尖上省钱
硬件选型这事儿,我个人的原则是:交易链路上的设备,能上多好上多好。因为延迟就是金钱,抖动就是亏损。
3.1.1 CPU:主频比核数重要
很多人一上来就问:要多少核?
其实在交易系统里,单线程延迟才是核心指标。你想想看,行情来了,处理逻辑往往是串行的。核再多,主频上不去,该慢还是慢。
| 参数 | 推荐配置 | 说明 |
|---|---|---|
| 主频 | ≥ 3.5 GHz(建议 4.0+) | 越高越好,直接影响单笔处理延迟 |
| 核心数 | 8-16 核(物理核) | 够用就行,别追求 64 核 |
| 缓存 | L3 ≥ 20 MB | 缓存命中率影响很大 |
| 架构 | Intel Xeon / AMD EPYC | 服务器级,别用消费级 CPU |
3.1.2 内存:容量够用,频率要快
内存这块,我建议:容量不是瓶颈,带宽才是。
- 容量: 32-64 GB 足够。除非你要把全市场历史 Tick 数据都怼进内存。
- 频率: DDR4-3200 起步,DDR5 更好。频率越高,内存延迟越低。
- 通道: 双通道是底线,四通道更佳。
3.1.3 网卡:低延迟是硬道理
网卡是交易系统的咽喉。我个人习惯:Solarflare 或 Mellanox,别用板载网卡。
| 特性 | 推荐 | 原因 |
|---|---|---|
| 速率 | 10 GbE / 25 GbE | 带宽够用,延迟低 |
| 硬件时间戳 | 必须支持 | 精准测量延迟,没有这个没法做基准测试 |
| 内核旁路 | 支持 DPDK / OpenOnload | 绕过内核协议栈,延迟降低 50%+ |
3.1.4 磁盘:NVMe 是标配
磁盘主要用来存日志和回测数据。我的建议很简单:全 NVMe SSD,别碰 HDD。
- 顺序读写: ≥ 3 GB/s
- 随机读写: ≥ 500K IOPS
- 容量: 1-2 TB 足够
为什么?因为日志写入是高频操作。HDD 的寻道时间会让你在压力测试时丢日志。嗯,我吃过这个亏。
3.2 操作系统调优:把默认配置扔掉
操作系统默认配置,说白了是为通用场景设计的。交易系统需要的是极致低延迟,所以必须调优。
3.2.1 内核参数调优
我常用的调优项,直接上代码:
# 网络调优
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.netdev_budget = 600
net.core.netdev_budget_usecs = 4000
# CPU 调优
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
kernel.numa_balancing = 0
# 内存调优
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
3.2.2 CPU 隔离与中断绑定
交易进程最怕什么?被其他进程打断。
所以,我建议:把 CPU 核心隔离出来,专门给交易进程用。
# 在 grub 中配置 isolcpus
GRUB_CMDLINE_LINUX="isolcpus=2-7 nohz_full=2-7 rcu_nocbs=2-7"
# 中断绑定到非隔离核心
echo 1 > /proc/irq/45/smp_affinity # 绑定到 CPU 0
这样做的好处是:交易进程跑在隔离核心上,不会被调度器打断。延迟抖动从微秒级降到纳秒级。
3.2.3 关闭不必要的服务
系统越干净,延迟越稳定。我一般会关掉:
- 防火墙(iptables / firewalld)
- SELinux
- cron / atd
- 系统日志(rsyslog 只保留必要级别)
- 电源管理(设置为 performance 模式)
3.3 网络拓扑设计:扁平化是王道
网络拓扑这块,我的原则很简单:层级越少越好,跳数越少越好。
为什么?每一跳都增加延迟。你想想看,行情从交易所到你的策略服务器,中间经过 3 台交换机,每台增加 1-2 微秒,加起来就是 3-6 微秒。在纳秒级竞争的时代,这差距太大了。
3.3.1 推荐拓扑:两层架构
我常用的拓扑是这样的:
这种拓扑的好处是:
- 延迟低: 任何两台服务器之间最多 2 跳
- 易排查: 网络问题定位简单,不用逐层查
- 可扩展: 加服务器直接连核心交换机就行
3.3.2 避免的拓扑
我见过有人用三层架构(接入层-汇聚层-核心层),结果延迟多了 5 微秒。说实话,这种设计适合数据中心,不适合交易系统。
3.4 时钟同步方案:时间就是金钱
时钟同步,是基准测试里最容易忽略、也最容易出问题的一环。
你想想看,如果两台服务器的时钟差了几毫秒,你测出来的延迟数据还有意义吗?
3.4.1 PTP 是首选
NTP 的精度在毫秒级,对于交易系统来说不够。我推荐用 PTP(Precision Time Protocol),精度可以达到亚微秒级。
| 协议 | 精度 | 适用场景 |
|---|---|---|
| NTP | 1-10 ms | 非交易系统,日志时间戳 |
| PTP(硬件) | < 1 μs | 交易系统,延迟测量 |
| GPS 时钟 | < 100 ns | 高频交易,纳秒级精度 |
3.4.2 部署方案
我常用的方案是:
- 主时钟: 用 GPS 驯服时钟作为 Grandmaster
- 边界时钟: 交换机支持 PTP 边界时钟模式
- 从时钟: 所有服务器网卡支持硬件 PTP
# 检查网卡是否支持 PTP
ethtool -T eth0 | grep -i ptp
# 配置 PTP 服务(linuxptp 包)
# /etc/ptp4l.conf
[global]
network_transport = L2
delay_mechanism = E2E
clockClass = 248
clockAccuracy = 0xFE
priority1 = 128
priority2 = 128
domainNumber = 0
logging_level = 5
path_trace_enabled = 1
use_syslog = 1
summary_interval = 0
3.4.3 验证时钟同步
配置完一定要验证。我常用的命令:
# 查看 PTP 状态
pmc -u -b 0 'GET CURRENT_DATA_SET'
pmc -u -b 0 'GET TIME_STATUS_NP'
# 查看时钟偏移
ptp4l -m -i eth0 | grep offset
# 对比两台服务器的时间
date +%s.%N
3.5 本章小结
测试环境搭建,说白了就是三个字:控变量。
- 硬件选型:控制性能变量,别让硬件成为瓶颈
- 系统调优:控制软件变量,别让操作系统捣乱
- 网络拓扑:控制路径变量,别让网络增加延迟
- 时钟同步:控制时间变量,别让时钟偏差搞乱数据
这四个方面做好了,你的基准测试数据才有说服力。否则,测出来的结果只能骗自己。
下一章,咱们聊聊测试脚本怎么写。嗯,那又是另一门学问了。