第一章 硬件选型与服务器调优:CPU选型、NUMA绑定与BIOS设置

各位做量化交易的朋友,大家好。我是你们这门课的主讲人。今天咱们聊聊硬件选型与服务器调优。说白了,就是怎么挑一台能打硬仗的机器,让它为你的港股交易系统跑出微秒级的优势。

我见过太多团队,算法写得漂亮,策略回测也漂亮,结果一上实盘,延迟就是下不去。为什么?硬件没调好。你想想看,一个微秒级的交易系统,硬件就是地基。地基不稳,上层建筑再花哨也没用。

核心观点:在港股交易中,微秒级的延迟差异,可能就是盈利与亏损的分水岭。硬件选型与调优,是降低延迟的第一道关卡。

1.1 CPU选型:高频 vs 核心数

这是最基础,也是最容易踩坑的地方。很多人一上来就问:“老师,我该买多少核的CPU?” 我的回答是:先别急着看核心数,先看频率。

我个人习惯,做交易系统的CPU,首选高频。为什么?因为交易系统的核心逻辑,往往是单线程的。你想想看,行情来了,你得解析、计算、下单,这一连串动作,如果分散到多个核心上,光是线程切换的开销,就够你喝一壶的。

我在项目中遇到过,有人用了一颗28核的服务器CPU,结果延迟还不如一颗4核的家用CPU。原因很简单:那28核的CPU,单核频率只有2.0GHz,而家用CPU能跑到4.5GHz。对于单线程任务,频率就是王道。

CPU类型 单核频率 核心数 适用场景
高频CPU(如Intel i9-13900K) 5.8 GHz 8大核+16小核 交易核心逻辑、行情解析
多核CPU(如AMD EPYC 7763) 2.45 GHz 64核 回测、风控、数据存储

当然,也不是说核心数完全没用。我的建议是:交易节点用高频CPU,回测和风控节点用多核CPU。这样各司其职,性价比最高。

小技巧:选CPU时,可以关注一下“Turbo Boost”或“Precision Boost”频率。有些CPU标称基础频率不高,但单核睿频能力很强,这种也值得考虑。

1.2 NUMA绑定:让数据离CPU更近

NUMA,全称Non-Uniform Memory Access,非一致性内存访问。听起来很玄乎,其实说白了就是:在多CPU的服务器里,每个CPU访问自己“附近”的内存快,访问“远处”的内存慢。

我曾经在一台双路服务器上做测试,发现同样的代码,跑在不同的核心上,延迟差了30%。一开始我以为是代码问题,查了半天,最后发现是NUMA没绑好。那个核心访问的内存,恰好是另一个CPU的“地盘”,每次读写都要跨总线,延迟自然就上去了。

怎么解决?绑定。把进程或线程,绑定到指定的CPU核心上,同时把内存也分配到这个CPU的本地内存上。

在Linux下,我们可以用numactl命令来实现:

# 将进程绑定到CPU 0-3,并分配本地内存
numactl --cpunodebind=0 --membind=0 ./trading_engine

如果你用的是C++,也可以用sched_setaffinity函数在代码里绑定:

#include <sched.h>
#include <pthread.h>

void bind_to_core(int core_id) {
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(core_id, &cpuset);
    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
}

注意:NUMA绑定不是万能的。如果你的程序需要大量跨CPU通信,强行绑定反而可能降低性能。需要根据实际场景测试。

1.3 BIOS设置:关掉那些“贴心”的功能

BIOS,基本输入输出系统。服务器厂商为了“稳定”和“省电”,默认开启了很多功能。但这些功能,对低延迟交易系统来说,就是灾难。

我印象最深的一次,是帮一家券商调优。他们的交易系统延迟总是忽高忽低,排查了半个月,最后发现是BIOS里的“C-State”没关。这个功能会在CPU空闲时降低频率,结果行情一来,CPU要从休眠状态“醒”过来,这一醒,几百微秒就没了。

以下是我个人习惯的BIOS设置清单:

  • 关闭C-State:防止CPU进入深度休眠
  • 关闭Turbo Boost:虽然它能提频,但频率波动会导致延迟不稳定。我建议锁定在最高频率
  • 关闭Hyper-Threading:超线程会引入资源竞争,对低延迟不利
  • 关闭节能模式:包括SpeedStep、Cool'n'Quiet等
  • 开启Performance模式:让CPU始终处于最高性能状态

避坑指南:我曾经遇到过,关闭Turbo Boost后,CPU频率反而上不去了。后来发现是BIOS版本太旧,升级后就好了。所以,记得先升级BIOS到最新版本。

1.4 CPU隔离与中断亲和性

这是进阶技巧。CPU隔离,就是把某些核心“藏”起来,不让操作系统调度普通进程上去。这些核心,只跑你的交易程序。

为什么要这么做?因为操作系统会时不时地产生中断,比如时钟中断、网络中断。如果这些中断跑到了你的交易核心上,就会打断你的程序,造成延迟抖动。

在Linux启动参数里,可以这样设置:

isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3

这个配置的意思是:隔离CPU 2和3,让它们不处理定时器中断,也不处理RCU回调。这样,你的交易程序就可以独占这两个核心。

然后,再把中断绑定到其他核心上:

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

# 将中断绑定到CPU 0
echo 1 > /proc/irq/<中断号>/smp_affinity

嗯,这里要注意:smp_affinity的值是位掩码。比如,绑定到CPU 0,就写1;绑定到CPU 1,就写2;绑定到CPU 0和1,就写3。

核心思路:让交易程序独占核心,让中断和操作系统任务去别的核心。这样,交易程序就不会被任何东西打断,延迟自然就稳定了。

知识体系总览

下面这张图,是我自己画的,把本章的核心知识点串了起来。你可以把它当作一个检查清单,看看自己有没有遗漏。

港股交易系统微秒级优化 - 硬件选型与调优 CPU选型 NUMA绑定 BIOS设置 CPU隔离与中断亲和性 高频 vs 核心数 交易节点 vs 回测节点 numactl命令绑定 sched_setaffinity 关闭C-State/Turbo Boost 关闭超线程/节能模式 isolcpus内核参数 中断亲和性设置 目标:降低延迟抖动,实现微秒级稳定响应 让交易程序独占核心,不受中断和操作系统干扰

好了,这一章的内容就到这里。硬件选型与调优,是微秒级优化的第一步,也是最基础的一步。把这些做好了,后面的网络优化、内核调优才能发挥出最大效果。

记住一句话:硬件是骨架,软件是血肉。骨架不正,血肉再丰满也立不起来。

专注资料整理