第一章 硬件选型与服务器调优: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。
核心思路:让交易程序独占核心,让中断和操作系统任务去别的核心。这样,交易程序就不会被任何东西打断,延迟自然就稳定了。
知识体系总览
下面这张图,是我自己画的,把本章的核心知识点串了起来。你可以把它当作一个检查清单,看看自己有没有遗漏。
好了,这一章的内容就到这里。硬件选型与调优,是微秒级优化的第一步,也是最基础的一步。把这些做好了,后面的网络优化、内核调优才能发挥出最大效果。
记住一句话:硬件是骨架,软件是血肉。骨架不正,血肉再丰满也立不起来。