第一章 硬件选型与调优:CPU、内存、网卡、SSD的选型策略,以及BIOS/内核参数调优
做低延迟交易系统,说白了就是跟硬件谈恋爱。你代码写得再漂亮,硬件不给力,行情来了照样卡成PPT。我这些年踩过的坑,十有八九都出在硬件选型上。今天咱们就聊聊,怎么给流计算系统挑一套靠谱的硬件,再把它调教到最佳状态。
核心原则:低延迟系统的硬件选型,不是买最贵的,而是买最对的。每一毫秒的延迟,都可能是真金白银的损失。
1.1 CPU选型:主频 vs 核心数,怎么选?
很多人一上来就问:核心数越多越好吗?其实不是。对于流计算场景,尤其是高频交易,单核性能远比核心数重要。为什么?因为大部分行情处理是串行的,你没法把一笔订单拆到多个核上去并行处理。
我个人习惯,优先看这几个指标:
- 主频:越高越好,4.0GHz起步,能上5.0GHz就别犹豫
- 缓存:L3缓存越大越好,至少20MB以上
- 架构:Intel的Xeon W系列或AMD的Ryzen Threadripper Pro,都行
- 超线程:建议关闭。我在项目中遇到过,超线程反而导致延迟抖动
我的经验:曾经有个项目,用了48核的服务器,结果行情处理延迟反而比16核的还高。排查了半天,发现是NUMA架构导致的跨核访问延迟。后来强制绑核,问题才解决。
1.2 内存选型:频率、时序、容量,一个都不能少
内存这块,很多人只盯着容量看。其实对于低延迟系统,内存频率和时序同样关键。你想想看,CPU每秒处理上亿条指令,内存如果跟不上,CPU就得干等着。
选内存时,我建议按这个优先级来:
- 频率:DDR5-5600起步,能上DDR5-6400更好
- 时序:CL值越低越好,CL30以下为佳
- 容量:根据数据量来,一般64GB-256GB够用
- 通道数:尽量插满所有内存通道,发挥带宽优势
| 内存类型 | 频率 | 时序(CL) | 适用场景 |
|---|---|---|---|
| DDR4-3200 | 3200MHz | CL16-18 | 入门级流计算 |
| DDR5-5600 | 5600MHz | CL28-32 | 中端交易系统 |
| DDR5-6400 | 6400MHz | CL26-30 | 高频交易核心 |
注意:别为了省钱混插不同频率的内存条。系统会自动降频到最低的那条,得不偿失。我曾经吃过这个亏,花了冤枉钱还降了性能。
1.3 网卡选型:低延迟网卡的核心参数
网卡是流计算系统的咽喉。行情数据从交易所过来,第一关就是网卡。选错了,后面再怎么优化都白搭。
我推荐关注这几个点:
- Solarflare/Mellanox:这两家是低延迟网卡的标杆,支持硬件时间戳和内核旁路
- 端口速率:至少25GbE,50GbE或100GbE更好
- 硬件卸载:支持TCP/UDP校验和卸载、RSS、流分类
- 驱动支持:必须支持DPDK或OpenOnload
嗯,这里要注意:不是所有万兆网卡都适合低延迟。有些消费级网卡,延迟能到几十微秒,根本没法用。我建议直接上Solarflare X2522或Mellanox ConnectX-6,贵是贵了点,但省心。
1.4 SSD选型:NVMe是标配,但别忽略IOPS
虽然流计算主要靠内存,但日志、快照、回放这些场景还是离不开SSD。选SSD时,别只看顺序读写速度,随机读写和IOPS才是关键。
我个人的选择标准:
- 接口:NVMe PCIe 4.0或5.0,别用SATA
- IOPS:4K随机读取至少500K,写入至少300K
- 延迟:平均延迟低于100μs,P99低于500μs
- 耐用性:DWPD(每日全盘写入次数)至少1次
避坑指南:我曾经用过某品牌的消费级SSD,跑行情回放时,每过几分钟就卡一下。后来发现是垃圾回收导致的延迟抖动。换成企业级SSD后,问题消失。所以,别在SSD上省钱。
1.5 BIOS调优:解锁硬件的全部潜力
硬件买回来,默认设置通常不是最优的。BIOS里藏着很多性能开关,调好了能省下几微秒。我每次装机,必调这几个参数:
- 关闭C-States:防止CPU进入节能模式,减少唤醒延迟
- 关闭Turbo Boost:虽然能提频,但频率波动会导致延迟不稳定
- 关闭超线程:如前所述,减少上下文切换
- 设置Performance Mode:锁定最高性能
- 关闭NUMA:如果应用不支持NUMA,就关掉它
# 示例:在Linux下查看CPU C-State状态
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/name
# 如果看到 "POLL"、"C1"、"C2" 等,说明C-States未关闭
1.6 内核参数调优:让操作系统为低延迟让路
操作系统默认是为通用场景优化的,对低延迟来说,很多默认参数反而是累赘。我习惯在部署前,先调一遍内核参数。
核心调优项:
- CPU隔离:用isolcpus参数把部分核心隔离出来,专供业务进程使用
- 中断亲和性:把网卡中断绑定到特定核心,避免中断风暴
- 内存大页:启用HugePages,减少TLB miss
- 进程优先级:用chrt设置实时调度策略,比如SCHED_FIFO
# 内核启动参数示例(/etc/default/grub)
GRUB_CMDLINE_LINUX="isolcpus=2-7 nohz_full=2-7 rcu_nocbs=2-7 intel_pstate=disable"
# 启用大页
echo 2048 > /proc/sys/vm/nr_hugepages
mount -t hugetlbfs nodev /mnt/hugepages
警告:调内核参数时,一定要先在测试环境验证。我曾经在生产环境直接改了isolcpus,结果系统服务全跑到了剩下的核心上,导致负载飙升。嗯,那次教训挺深刻的。
知识体系总览
下面这张图,是我对本章内容的总结。硬件选型和调优,本质上是一个从选到调的闭环:先选对硬件,再通过BIOS和内核参数把性能榨干。
这张图把整个流程串起来了。左边是硬件选型,右边是调优策略。你从CPU、内存、网卡、SSD四个维度选好硬件后,再通过BIOS和内核参数把性能调到极致。每一步都环环相扣,缺一不可。
总结一句话:硬件选型决定了系统的上限,调优决定了你能接近这个上限多少。两者都做好,你的流计算系统才能真正做到低延迟。