rust高性能撮合引擎的设计
代码层面设计
交易对消费的实现
- 单线程消费,避免锁竞争的问题
- cpu 核隔离,isolcpus,单独用来做撮合操作.
- cpu 核绑定,core_affinity
2和3的操作避免系统进程抢核导致的业务处理抖动。
下单逻辑梳理crossbeam_channel
类似内存的消息组件,crossbeam Multi-Producer Multi-Consumer:多生产者、多消费者。
系统调优
实时优先级(SCHED_FIFO)
原理
SCHED_FIFO(先进先出)是 Linux 内核的一种严格实时调度策略。在此策略下,任务按优先级排队;一旦获取 CPU,该任务将持续独占运行直至主动放弃或被更高优先级任务抢占,没有时间片限制。消除 OS 定时器中断导致的延迟尖峰
配置
配置系统限制
编辑 /etc/security/limits.d/[用户信息].conf
1 | kerns soft rtprio 99 |
配置项 含义
rtprio 99
允许设置实时调度优先级(配合 chrt -f 99 用 SCHED_FIFO)
memlock unlimited
允许锁定内存(避免关键页换出导致延迟尖峰)
使用 chrt 启动
1 | # 优先级 99 = 最高实时优先级 |
验证实时调度
1 | PID=$(pgrep kerns-matcher) |
IRQ 中断迁移
将网卡等硬件中断迁离撮合核,避免中断抢占撮合线程。
查看 IRQ 分布
1 | cat /proc/interrupts | head -5 |
绑定 IRQ 到非撮合核(如 core 0)
1 | # 假设网卡 IRQ 号为 128,绑到 core 0(bitmask 0x1) |
cpu隔离 isolcpus:
原理
- 独占计算资源:防止系统调度器将其他普通后台进程或线程随机分配到被隔离的 CPU 上,保障关键任务(如高频交易系统、实时音视频处理、工业控制等)获得 100% 的硬件算力。
- 减少上下文切换与缓存污染:避免由于其他任务频繁进出 CPU 导致的 CPU 缓存(Cache)被刷新或覆盖,从而提升程序执行的命中率。
- 降低抖动(Jitter):通过避免不必要的中断和调度切换,将系统抖动降至最低,通常结合 taskset 或 pthread_setaffinity_np 将特定线程强制绑定到该核心上执行。如果不设置,操作系统的任务调度会干扰业务系统,导致业务抖动。
配置
修改 GRUB 启动参数
编辑 /etc/default/grub:
1 | sudo vim /etc/default/grub |
在 GRUB_CMDLINE_LINUX 中追加(按实际核号调整):
1 | isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 intel_pstate=disable processor.max_cstate=1 idle=poll |
| 参数 | 作用 |
|---|---|
isolcpus=2,3 |
核心 2、3 不参与普通进程调度 |
nohz_full=2,3 |
关闭这些核上的定时器 tick |
rcu_nocbs=2,3 |
RCU 回调不在这些核执行 |
intel_pstate=disable |
禁用变频(Intel,可选) |
processor.max_cstate=1 |
限制 CPU 深度睡眠(可选) |
AMD CPU 将
intel_pstate=disable换为amd_iommu=off等按厂商文档调整。
更新 GRUB 并重启
Ubuntu / Debian:
1 | sudo update-grub |
RHEL / Rocky / CentOS:
1 | sudo grub2-mkconfig -o /boot/grub2/grub.cfg |
重启后验证
1 | # 确认内核参数已生效 |