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

做量化交易系统性能测试,最怕什么?

我最怕的是:测了半天,结果根本不准。不是系统不行,是环境搭得有问题。你想想看,硬件选错了、操作系统没调优、网络拓扑有瓶颈、时钟不同步——这些坑随便踩一个,你的基准测试数据就废了。

这一章,我就把搭建测试环境的经验掰开揉碎了讲。咱们从硬件选型开始,一步步来。

3.1 硬件选型:别在刀尖上省钱

硬件选型这事儿,我个人的原则是:交易链路上的设备,能上多好上多好。因为延迟就是金钱,抖动就是亏损。

3.1.1 CPU:主频比核数重要

很多人一上来就问:要多少核?

其实在交易系统里,单线程延迟才是核心指标。你想想看,行情来了,处理逻辑往往是串行的。核再多,主频上不去,该慢还是慢。

参数 推荐配置 说明
主频 ≥ 3.5 GHz(建议 4.0+) 越高越好,直接影响单笔处理延迟
核心数 8-16 核(物理核) 够用就行,别追求 64 核
缓存 L3 ≥ 20 MB 缓存命中率影响很大
架构 Intel Xeon / AMD EPYC 服务器级,别用消费级 CPU
我的经验: 曾经为了省钱,用了一颗 2.1 GHz 的低频 CPU 做回测。结果同样的策略,比同事的 4.0 GHz 机器慢了 40%。后来换掉,成本翻倍,但时间成本省回来了。

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

内存这块,我建议:容量不是瓶颈,带宽才是

  • 容量: 32-64 GB 足够。除非你要把全市场历史 Tick 数据都怼进内存。
  • 频率: DDR4-3200 起步,DDR5 更好。频率越高,内存延迟越低。
  • 通道: 双通道是底线,四通道更佳。
注意: 别买 ECC 内存?不,交易系统一定要 ECC。数据错一位,可能就爆仓了。我见过一次内存比特翻转导致订单价格多了一个零……嗯,那场面。

3.1.3 网卡:低延迟是硬道理

网卡是交易系统的咽喉。我个人习惯:Solarflare 或 Mellanox,别用板载网卡。

特性 推荐 原因
速率 10 GbE / 25 GbE 带宽够用,延迟低
硬件时间戳 必须支持 精准测量延迟,没有这个没法做基准测试
内核旁路 支持 DPDK / OpenOnload 绕过内核协议栈,延迟降低 50%+
避坑指南: 我曾经用了一款不支持硬件时间戳的网卡做延迟测试。结果测出来的数据忽高忽低,查了三天才发现是网卡时间戳不准。后来换了 Solarflare,问题立刻解决。

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 推荐拓扑:两层架构

我常用的拓扑是这样的:

推荐网络拓扑:两层扁平架构 交易所网关 核心交换机(25 GbE) 策略服务器 行情服务器 测试客户端 监控节点 所有服务器直连核心交换机,减少跳数

这种拓扑的好处是:

  • 延迟低: 任何两台服务器之间最多 2 跳
  • 易排查: 网络问题定位简单,不用逐层查
  • 可扩展: 加服务器直接连核心交换机就行

3.3.2 避免的拓扑

我见过有人用三层架构(接入层-汇聚层-核心层),结果延迟多了 5 微秒。说实话,这种设计适合数据中心,不适合交易系统。

我的建议: 如果预算允许,直接用 25 GbE 交换机,别用 10 GbE。差价不大,但带宽翻倍,未来三年不用升级。

3.4 时钟同步方案:时间就是金钱

时钟同步,是基准测试里最容易忽略、也最容易出问题的一环。

你想想看,如果两台服务器的时钟差了几毫秒,你测出来的延迟数据还有意义吗?

3.4.1 PTP 是首选

NTP 的精度在毫秒级,对于交易系统来说不够。我推荐用 PTP(Precision Time Protocol),精度可以达到亚微秒级。

协议 精度 适用场景
NTP 1-10 ms 非交易系统,日志时间戳
PTP(硬件) < 1 μs 交易系统,延迟测量
GPS 时钟 < 100 ns 高频交易,纳秒级精度

3.4.2 部署方案

我常用的方案是:

  1. 主时钟: 用 GPS 驯服时钟作为 Grandmaster
  2. 边界时钟: 交换机支持 PTP 边界时钟模式
  3. 从时钟: 所有服务器网卡支持硬件 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
我的经验: 曾经用 NTP 做时钟同步,测出来的延迟数据偏差了 2 毫秒。后来换成 PTP,偏差降到 500 纳秒。数据质量完全不一样。

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
注意: 时钟同步不是配完就完事了。要持续监控。我见过交换机重启后 PTP 配置丢失,导致时钟偏差越来越大。建议加个告警,偏差超过 1 微秒就报警。

3.5 本章小结

测试环境搭建,说白了就是三个字:控变量

  • 硬件选型:控制性能变量,别让硬件成为瓶颈
  • 系统调优:控制软件变量,别让操作系统捣乱
  • 网络拓扑:控制路径变量,别让网络增加延迟
  • 时钟同步:控制时间变量,别让时钟偏差搞乱数据

这四个方面做好了,你的基准测试数据才有说服力。否则,测出来的结果只能骗自己。

下一章,咱们聊聊测试脚本怎么写。嗯,那又是另一门学问了。


专注资料整理