第二章 硬件选型与配置:CPU微架构与内存层级
做高频交易系统,硬件选型是地基。地基没打好,上层软件优化得再好也白搭。我见过太多团队,代码写得飞起,结果跑在错误的硬件上,延迟就是降不下来。今天咱们就聊聊CPU、内存和网卡这些核心硬件的选型要点。
2.1 CPU微架构:NUMA、睿频与超线程
CPU是交易系统的大脑。选错了,你的策略就比别人慢一拍。我个人习惯,先看微架构,再看主频和核心数。
2.1.1 NUMA架构
NUMA,全称是非统一内存访问。说白了,就是每个CPU核心访问不同内存区域的速度不一样。为什么会这样?因为物理上,内存是挂在特定CPU上的。
我遇到过最典型的坑:一个交易进程跑在CPU 0上,但它分配的内存却在CPU 1的本地内存上。每次访问内存都要跨CPU走QPI总线,延迟直接翻倍。嗯,这里要注意,绑定CPU和内存的亲和性是基本功。
核心原则:让进程和它使用的内存在同一个NUMA节点上。
怎么检查?用 numactl --hardware 命令。你会看到类似这样的输出:
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3
node 0 size: 32768 MB
node 1 cpus: 4 5 6 7
node 1 size: 32768 MB
node distances:
node 0 1
0: 10 20
1: 20 10
看到那个 node distances 了吗?10是本地访问,20是跨节点访问。延迟差一倍。所以,我建议你启动交易进程时,用 numactl --cpunodebind=0 --membind=0 强制绑定。
2.1.2 睿频与超线程
睿频,就是CPU自动超频。听起来很美好,但做高频交易时,我建议你关掉它。为什么?因为睿频的触发有延迟,而且不稳定。你想想看,一个订单来了,CPU突然从2.5GHz跳到4.0GHz,中间那几百纳秒的波动,足以让订单错过最佳时机。
超线程呢?更是个大坑。超线程让一个物理核心模拟成两个逻辑核心。但这两个逻辑核心共享L1缓存和执行单元。一旦它们同时争抢资源,性能反而下降。我曾经在项目里测试过,开启超线程后,交易系统的P99延迟从5微秒飙升到15微秒。所以,高频交易服务器,务必在BIOS里关闭超线程。
警告:不要相信操作系统默认设置。BIOS里关掉睿频和超线程,是低延迟服务器的第一步。
2.2 内存层级:L1/L2/L3缓存与DDR5
内存是另一个关键战场。CPU缓存的速度比主存快两个数量级。你的数据在哪个层级,直接决定了延迟。
2.2.1 缓存层级
典型的Intel Skylake架构,L1缓存32KB,L2缓存256KB,L3缓存8-16MB。访问延迟分别是:L1约1纳秒,L2约4纳秒,L3约12纳秒,主存约60纳秒。你想想看,如果数据在L1里,处理一个订单只需要1纳秒;如果数据在主存里,就要60纳秒。差距是60倍。
怎么让数据留在缓存里?我个人的经验是:
- 数据对齐:把热数据放在同一个缓存行(64字节)内。用
__attribute__((aligned(64)))强制对齐。 - 预取指令:用
_mm_prefetch提前把数据加载到缓存。比如,处理当前订单时,预取下一个订单的数据。 - 避免伪共享:两个线程修改同一个缓存行的不同变量,会导致缓存行在核心间来回传输。用填充(padding)隔开它们。
// 伪共享示例:两个线程修改相邻变量
struct alignas(64) HotData {
int a; // 线程1修改
char pad[60]; // 填充到64字节
int b; // 线程2修改
};
2.2.2 DDR5内存
DDR5相比DDR4,带宽翻倍,延迟略有降低。但要注意,DDR5的延迟并不比DDR4好太多。为什么?因为DDR5的预取长度更长,导致CAS延迟(CL值)更高。比如DDR5-4800 CL40,实际延迟和DDR4-3200 CL16差不多。
所以,选内存时,别只看频率。要看实际延迟,计算公式是:延迟(纳秒)= CL值 × 2000 / 频率。比如DDR5-4800 CL40,延迟是40 × 2000 / 4800 = 16.67纳秒。而DDR4-3200 CL16,延迟是16 × 2000 / 3200 = 10纳秒。嗯,DDR4反而更快。
小技巧:高频交易服务器,建议用DDR5的高频低延迟型号,比如DDR5-6000 CL30。或者,如果你预算有限,DDR4-3600 CL14也是不错的选择。
2.3 网卡选型:Solarflare vs Mellanox
网卡是交易系统的咽喉。数据从网络进来,第一站就是网卡。选错了,延迟直接多几微秒。
2.3.1 Solarflare
Solarflare(现在叫Xilinx)的网卡,主打低延迟和硬件时间戳。我个人最喜欢它的OpenOnload技术。它绕过了内核协议栈,直接在用户态处理网络数据。延迟从10微秒降到1微秒以下。
我记得有一次,帮客户调优一个期货交易系统。他们用的普通网卡,延迟一直在8微秒左右。换成Solarflare X2522后,配合OpenOnload,延迟直接降到1.2微秒。客户当场就下单了。
Solarflare的选型要点:
- 硬件时间戳:支持PTP(精确时间协议),精度达到纳秒级。对做市商策略特别重要。
- TCP卸载:把TCP处理卸载到网卡上,释放CPU资源。
- 多队列:支持RSS(接收端缩放),把不同流分配到不同CPU核心。
2.3.2 Mellanox
Mellanox(现在叫NVIDIA)的网卡,主打高吞吐和RDMA。RDMA允许数据直接从网卡写入内存,完全绕过CPU。延迟可以做到几百纳秒。
但要注意,RDMA需要应用层支持。如果你的交易系统用的是标准TCP/IP,那Mellanox的优势就发挥不出来。我建议,只有当你需要处理大量数据(比如行情快照)时,才考虑Mellanox。
Mellanox的选型要点:
- ConnectX系列:ConnectX-6 Dx支持200Gbps,延迟低于1微秒。
- RoCE v2:基于以太网的RDMA,兼容性好。
- GPUDirect:如果用到GPU加速,可以直接在GPU和网卡间传输数据。
我的建议:如果主要做低延迟交易(比如纳秒级),选Solarflare。如果主要做高吞吐行情处理(比如微秒级),选Mellanox。两者各有千秋,没有绝对的好坏。
2.4 知识体系结构图
下面这张图,总结了本章的核心逻辑。你可以看到,硬件选型是一个层层递进的过程:从CPU到内存,再到网卡,每一层都影响最终延迟。
2.5 避坑指南
最后,分享几个我踩过的坑:
- 别信默认配置:BIOS默认开启睿频和超线程。我建议你拿到服务器后,第一件事就是进BIOS关掉它们。
- NUMA绑定要验证:用
numactl --show检查进程的绑定情况。我曾经遇到过,代码里绑定了,但操作系统又给解绑了。 - 网卡驱动要调优:Solarflare的驱动默认不是最低延迟模式。你需要设置
sfptool --set-rx-mode low-latency。 - 内存别插满:DDR5插满4条,频率会自动降级。我建议只插2条,跑在最高频率上。
最后一句:硬件选型没有银弹。每个系统都有自己的瓶颈。我的习惯是,先做性能剖析(profiling),找到瓶颈在哪,再针对性地选硬件。别盲目追求最贵的,适合你的才是最好的。
公众号:蓝海资料掘金营,微信deep3321