3、测试环境搭建:硬件选型、操作系统配置与网络拓扑设计

做基准测试,最怕什么?

怕你辛辛苦苦跑出来的数据,根本不能说明问题。

硬件选错了,操作系统没调好,网络拓扑有瓶颈——那你测出来的数字,说白了就是一堆废纸。我自己就吃过这个亏,所以今天咱们把这三个环节掰开揉碎了讲清楚。

3.1 硬件选型:ARM Cortex-A72 vs x86

先聊硬件。行情系统对硬件的要求其实很明确:低延迟、高吞吐、稳定。但ARM和x86,到底选哪个?

我个人习惯是这么判断的:看你的业务场景。

  • ARM Cortex-A72:功耗低,核心数多,适合做并行处理。如果你做的是多路行情订阅、数据分发,ARM的性价比很高。我在一个金融科技项目里用过RK3399(双核A72+四核A53),跑行情转发,单机扛了2000路订阅,CPU占用才60%。
  • x86(比如Intel Xeon或Core i7):单核性能强,指令集丰富,适合做复杂计算。比如行情解析、策略计算、盘口深度合成,这些场景x86有明显优势。尤其是AVX-512指令集,做向量化计算时,性能差距能拉到3倍以上。

核心结论

  • 纯转发/分发 → ARM(成本低、功耗低)
  • 计算密集型 → x86(单核性能强)
  • 混合场景 → 建议ARM做前端接入,x86做后端计算

嗯,这里要注意:不要只看CPU主频。ARM的A72虽然主频低(通常1.8-2.0GHz),但它的内存延迟控制得不错。我在项目中遇到过,同样的行情解析代码,A72比某些低端x86(比如Atom)反而快15%。

对比维度 ARM Cortex-A72 x86(典型)
单核性能 中等
多核扩展 优秀(8核起步) 一般(4-8核常见)
功耗 低(5-15W) 高(35-95W)
指令集 精简 丰富(AVX、AES-NI等)
适用场景 数据分发、协议转换 策略计算、深度合成

避坑指南:我曾经在一个项目里选了ARM,结果发现行情解析库依赖x86的SSE指令集,跑不了。后来花了三天重写解析逻辑。所以——先确认你的软件栈是否支持ARM,别等硬件到了才发现跑不起来。

3.2 操作系统配置:实时内核补丁

操作系统这块,很多人觉得装个Ubuntu就能跑。但做行情系统,普通内核不行

为什么?

因为Linux默认内核的调度策略是“公平调度”。它会让所有进程轮流用CPU,哪怕你的行情进程优先级再高,也可能被后台的日志、监控、甚至桌面动画打断。你想想看,行情数据到了,CPU却在处理别的事——延迟就上去了。

解决方案:打实时内核补丁(PREEMPT_RT)

我建议用两种方式之一:

  1. 直接安装RT内核:Ubuntu/Debian有现成的包,比如 linux-image-rt-amd64。装完重启,选RT内核启动就行。
  2. 自己编译内核:如果你需要定制化配置,比如关闭某些驱动、调整中断亲和性,那就自己编译。步骤大致如下:
# 下载内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.38.tar.xz
tar -xf linux-6.1.38.tar.xz
cd linux-6.1.38

# 打RT补丁
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.38-rt13.patch.xz
xzcat patch-6.1.38-rt13.patch.xz | patch -p1

# 配置内核(开启PREEMPT_RT)
make menuconfig
# 进入 General setup → Preemption Model → Fully Preemptible Kernel (RT)
# 保存退出

# 编译并安装
make -j$(nproc)
make modules_install
make install

注意:打RT补丁后,内核的吞吐量会下降5-10%。因为实时调度增加了上下文切换的开销。但延迟的确定性会大幅提升——从毫秒级降到微秒级。对于行情系统来说,这个取舍是值得的。

另外,别忘了调优内核参数。我常用的几个:

  • kernel.sched_rt_runtime_us = -1:允许RT进程占用100% CPU时间
  • kernel.sched_rt_period_us = 1000000:RT进程的调度周期
  • vm.swappiness = 10:减少内存交换,降低延迟抖动

个人经验:我曾经在一个项目里,RT内核装好了,但延迟还是不稳定。查了两天,发现是网卡中断绑到了CPU0,而行情进程也在CPU0上跑。后来用irqbalance把中断分散到其他核心,延迟立刻降了40%。所以——中断亲和性一定要调

3.3 网络拓扑设计

网络拓扑,说白了就是数据怎么流。

行情系统的网络拓扑,我一般分成三层:

  • 接入层:接收交易所的行情数据(通常是UDP组播)
  • 处理层:解析、清洗、合成盘口深度
  • 分发层:把处理后的数据推给下游客户端

下面这张图,是我常用的拓扑结构:

接入层 UDP组播接收 处理层 解析/清洗/深度合成 分发层 TCP/组播推送给客户端 核心交换机(万兆) 客户端A 客户端B 客户端C 接入层 处理层 分发层 交换机 客户端

这个拓扑有几个关键点:

  • 接入层和处理层之间,建议用万兆直连。我在项目中遇到过,千兆网卡在行情高峰期丢包率高达5%,换成万兆后降到0.01%以下。
  • 分发层用组播。如果客户端数量多(比如100+),TCP连接数会爆炸。组播一发多收,效率高得多。
  • 交换机要支持IGMP Snooping。否则组播流量会泛洪到所有端口,浪费带宽。

避坑指南:我曾经在一个项目里,接入层和处理层之间用了三层交换机,结果发现UDP组播跨网段转发时,延迟增加了200微秒。后来改成二层直连,延迟立刻降下来。所以——能二层就别三层,少一层转发,少一份延迟。

好了,硬件选型、操作系统配置、网络拓扑设计,这三个环节环环相扣。任何一个环节出问题,基准测试的数据都不靠谱。下一节咱们聊具体的测试工具和脚本怎么写——嗯,到时候再细说。


专注资料整理