高频交易和低延迟系统对 C++ 和 Linux 内核的要求极高,需要高效的代码执行、低延迟的通信机制、以及对操作系统底层的深入优化。以下是关键技术点:
高频交易需要极致的性能优化,因此 C++ 代码需要低延迟、高吞吐,通常采用以下技术:
(1)高性能数据结构
• Lock-free 数据结构(无锁队列、环形缓冲区)
• 采用 std::atomic 和 内存屏障(memory barriers) 来避免锁竞争
• 典型库:boost::lockfree、folly::ProducerConsumerQueue
• 内存池(Memory Pool)
• 避免频繁 new/delete 造成的碎片化
• 使用 tcmalloc, jemalloc, 或 mimalloc
• 内存对齐(Cache Line Optimization)
• 避免 false sharing(伪共享):
struct alignas(64) OrderBook {
int price;
int volume;
};
• 确保结构体大小是 CPU Cache Line(一般 64 字节)的整数倍
(2)低延迟多线程优化
• 使用 std::atomic 代替 std::mutex
• 例如:
std::atomic<int> counter;
counter.fetch_add(1, std::memory_order_relaxed);
• NUMA 亲和性(NUMA-aware threading)
• 使用 sched_setaffinity() 绑定线程到指定 CPU 核心:
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(2, &cpuset);
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
• 使用 epoll/io_uring 做事件驱动
• 低延迟 I/O 处理,而不是轮询(polling)
• io_uring 比 epoll 更高效:
struct io_uring ring;
io_uring_queue_init(32, &ring, 0);
(3)SIMD 加速计算
• 使用 AVX, AVX-512, SSE 加速矩阵计算、数值计算:
#include
__m256 v1 = _mm256_loadu_ps(arr1);
__m256 v2 = _mm256_loadu_ps(arr2);
__m256 result = _mm256_add_ps(v1, v2);
• FFT(快速傅里叶变换)用于市场信号处理:
• Intel MKL, FFTW, or CUDA FFT
(4)低延迟网络通信
• RDMA(远程直接内存访问)
• 直接绕过 CPU 访问远程服务器的内存
• 适用于 InfiniBand, RoCE (RDMA over Converged Ethernet)
• 用户态网络栈(DPDK, eBPF/XDP, VMA)
• DPDK(Data Plane Development Kit)绕过内核,直接访问网卡:
struct rte_mbuf *pkt;
pkt = rte_pktmbuf_alloc(mbuf_pool);
rte_eth_rx_burst(port_id, queue_id, &pkt, 1);
• XDP (eXpress Data Path) 直接在网卡驱动中处理数据包:
int xdp_prog(struct xdp_md *ctx) {
void *data = (void *)(long)ctx->data;
return XDP_DROP; // 丢弃数据包,减少延迟
}
• 零拷贝(Zero Copy)
• 使用 mmap() 和 sendfile() 避免不必要的 CPU 内存拷贝:
int fd = open("data.bin", O_RDONLY);
sendfile(sock_fd, fd, NULL, FILE_SIZE);
高频交易需要深入优化 Linux 内核,以降低系统抖动(jitter) 和 延迟。
(1)内核参数调优
调整 /etc/sysctl.conf:
# 禁用 Swap,防止内存交换影响延迟
vm.swappiness = 0
# 提高 TCP 处理能力
net.core.rmem_max = 26214400
net.core.wmem_max = 26214400
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
# 关闭 Nagle 算法,降低 TCP 发送延迟
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_low_latency = 1
(2)CPU 亲和性 & 高精度定时
• 绑定进程到特定 CPU 核心
taskset -c 1 ./my_hft_app
• 提高定时器精度
echo 0 > /sys/devices/system/cpu/cpu*/cpuidle/state*/disable
(3)内核旁路
• eBPF/XDP:直接在内核态处理网络数据包
• AF_XDP:比 epoll 更快的用户态 Socket
(4)高精度时钟同步
• 使用 PTP(Precision Time Protocol)
• 确保市场数据时间戳尽可能精准
phc_ctl /dev/ptp0 get
• 使用 TSC(Time Stamp Counter)
static inline uint64_t rdtsc() {
uint32_t lo, hi;
asm volatile ("rdtsc" : "=a"(lo), "=d"(hi));
return ((uint64_t)hi << 32) | lo;
}
总结
量化交易(特别是高频交易)要求极致的 C++ 性能优化 和 深入的 Linux 内核调优。涉及:
1. C++:无锁数据结构、SIMD、NUMA、RDMA、用户态网络栈
2. Linux:内核参数调优、eBPF/XDP、PTP 时间同步、CPU 亲和性
3. 网络:AF_XDP、RDMA、零拷贝、用户态协议栈
如果你想深入开发高频交易系统,建议你学习:
• 《Modern C++ Design》(高性能 C++ 设计)
• 《Linux Performance》(深入 Linux 调优)
• 《Financial Signal Processing》(量化金融信号处理)