2. CPU选型核心指标:主频、核心数、缓存(L1/L2/L3)、NUMA架构对延迟的影响
做高频交易硬件选型,CPU这块是重头戏。很多人一上来就问「核心数越多越好吗?」或者「主频是不是越高越牛?」。嗯,这个问题没那么简单。我这些年踩过的坑,今天一次性给你讲透。
2.1 主频:高频交易的第一道门槛
主频,说白了就是CPU每秒能跑多少个指令周期。3.0GHz意味着每秒30亿次震荡。对于高频交易来说,主频直接决定了你的策略逻辑能在多短的时间内完成一次判断。
我个人习惯:在选型时,主频是第一优先级。为什么?因为高频交易的瓶颈往往不在计算量,而在延迟。你想想看,一个简单的价差判断,可能只需要几十条指令。如果主频从2.5GHz提升到4.0GHz,理论上延迟能降低37.5%。
核心观点:高频交易场景下,主频优先于核心数。单线程延迟是王道。
我在项目中遇到过一家做期权做市商的团队,他们一开始买了28核的服务器,结果发现延迟比预期高了30%。后来换成8核但主频高0.8GHz的CPU,延迟直接降下来了。为什么?因为他们的策略是单线程的,多核根本用不上。
2.2 核心数:别被「核战争」忽悠了
核心数这个东西,在高频交易领域其实是个「伪需求」。你想想看,一个交易策略通常跑在一个线程里,最多两个线程(一个收行情,一个发订单)。给你64个核,大部分时间都在睡觉。
那什么时候需要多核?
- 同时运行多个独立策略(比如同时做股指期货和商品期货)
- 行情预处理和策略计算分离到不同核心
- 回测系统需要并行计算
但注意,核心数多了反而有副作用。核心越多,CPU内部的总线竞争越激烈,L3缓存的访问延迟也会增加。我见过一个案例,有人从8核升级到32核,结果单线程延迟反而增加了15%。
我的建议:高频交易服务器,4-8核足够了。把预算花在主频和缓存上,比堆核心数划算得多。
2.3 缓存(L1/L2/L3):被忽视的延迟杀手
缓存这个东西,很多人不重视。但说实话,在高频交易里,缓存命中率直接决定了你的延迟稳定性。
先看一组典型数据:
| 缓存层级 | 典型大小 | 访问延迟(时钟周期) | 命中率影响 |
|---|---|---|---|
| L1 | 32KB - 64KB | 3-4 cycles | 极高 |
| L2 | 256KB - 1MB | 10-12 cycles | 高 |
| L3 | 8MB - 32MB | 30-40 cycles | 中 |
| 内存 | 几十GB | 100+ cycles | 低 |
看到没?L1缓存访问只要3个时钟周期,而内存访问要100多个周期。差了30多倍!
我曾经帮一个客户优化策略,发现他的行情数据总是从内存里读,延迟波动很大。后来我把行情数据的关键字段(比如最新价、买卖盘口)压缩到刚好能放进L1缓存的大小,延迟直接降了60%。
避坑指南:选CPU时,别只看L3缓存大小。L1和L2的延迟更重要。我建议优先选L1缓存大的型号,比如Intel的某些Xeon系列L1有64KB,比AMD的32KB在行情处理上更有优势。
2.4 NUMA架构:多路服务器的隐形陷阱
NUMA(非统一内存访问)架构,说白了就是CPU和内存不是「一对一」的关系了。在多路服务器里,每个CPU有自己的本地内存,访问本地内存快,访问远程内存慢。
为什么会这样?因为CPU之间通过QPI(QuickPath Interconnect)或UPI(Ultra Path Interconnect)总线连接。访问远程内存需要经过这条总线,延迟自然就高了。
我画了一张图,帮你理解NUMA架构下的延迟差异:
看到这张图你就明白了。CPU 0访问自己的本地内存只要100ns左右,但访问CPU 1的内存要200ns,翻了一倍!
我在项目中遇到过一个典型问题:某团队用双路服务器跑高频策略,发现延迟忽高忽低。排查了半天,发现是操作系统把进程调度到了CPU 0,但内存分配在了CPU 1的插槽上。每次访问内存都要走QPI总线,延迟自然不稳定。
解决方案:使用numactl工具绑定CPU和内存。比如:
# 绑定到CPU 0,并分配本地内存
numactl --cpubind=0 --membind=0 ./trading_strategy
这样就能保证策略进程始终访问本地内存,延迟稳定在100ns左右。
2.5 实战选型建议
说了这么多,给你一个实际的选型清单:
- 主频:优先选4.0GHz以上的型号,能上5.0GHz更好
- 核心数:4-8核足够,别超过16核
- 缓存:L1至少64KB,L2至少1MB,L3至少16MB
- NUMA:尽量用单路服务器,如果必须用多路,做好CPU和内存绑定
- 功耗:TDP控制在150W以内,否则散热和供电都是问题
一句话总结:高频交易的CPU选型,主频 > 缓存 > 核心数。别被参数表上的核心数忽悠了,延迟才是硬道理。
嗯,CPU这块就先讲到这里。下一节我们会聊内存选型,那个坑更多,尤其是内存频率和时序对延迟的影响,到时候再细说。