3、开发环境搭建:Linux系统优化、内核参数调优、编译器优化、依赖库安装

做高频交易,说白了就是跟时间赛跑。你想想看,别人下单比你快1微秒,赚钱的就是他。所以环境搭建这步,我从来不敢马虎。今天咱们就把这套东西从头到尾捋一遍。

3.1 Linux系统选型与基础优化

我个人习惯用Ubuntu Server 22.04 LTS。为什么?因为社区活跃,遇到坑好找人问。但如果你追求极致稳定,RHEL系也行。我建议用最小化安装,别装桌面,省下来的资源都是你的。

装完系统第一件事,关掉没用的服务:

# 关掉不必要的服务
systemctl disable bluetooth
systemctl disable cups
systemctl disable avahi-daemon

# 关掉防火墙(内网环境)
systemctl stop ufw
systemctl disable ufw

嗯,这里要注意。关防火墙的前提是你的机器在内网,而且有硬件防火墙保护。别在公网裸奔,我吃过这个亏。

3.2 内核参数调优

内核参数调优,这是高频交易系统的核心。我当年第一次调这些参数时,差点把系统搞崩。后来总结了一套稳妥的方案。

打开 /etc/sysctl.conf,加上这些:

# 网络优化
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_fastopen = 3

# 低延迟优化
net.ipv4.tcp_low_latency = 1
net.ipv4.tcp_sack = 0
net.ipv4.tcp_dsack = 0

# 内存优化
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

关键参数解释:

  • tcp_low_latency:牺牲吞吐量换延迟,适合高频交易
  • swappiness = 1:尽量不用swap,内存不够就报错,别卡
  • tcp_fastopen:减少TCP握手次数,能省几十微秒

警告:调优前先备份原文件。我曾经在线上环境直接改参数,结果网络断了,只能跑机房去重启。现在学乖了,先 cp /etc/sysctl.conf /etc/sysctl.conf.bak

3.3 编译器优化

编译器选GCC还是Clang?我建议用Clang。为什么?因为它的错误提示更友好,而且编译出来的二进制在某些场景下更快。

安装Clang:

apt install clang-14 lld-14
# 设置默认编译器
update-alternatives --install /usr/bin/cc cc /usr/bin/clang-14 100
update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-14 100

编译参数这样配:

# 高频交易专用编译参数
CXXFLAGS = -O3 -march=native -mtune=native -flto -ffast-math
CXXFLAGS += -fno-exceptions -fno-rtti  # 减少二进制体积
CXXFLAGS += -falign-functions=64       # 对齐到缓存行

小技巧:-march=native 会让编译器针对你的CPU做优化。但如果你要分发二进制,就别用这个,否则换台机器就跑不起来了。

3.4 依赖库安装

高频交易系统离不开三个库:ZeroMQ、Redis、Boost。我一个个说。

3.4.1 ZeroMQ

ZeroMQ是消息队列,说白了就是让不同进程之间快速传数据。我选它是因为它延迟低,而且支持多种模式。

# 从源码编译(推荐)
wget https://github.com/zeromq/libzmq/releases/download/v4.3.4/zeromq-4.3.4.tar.gz
tar xf zeromq-4.3.4.tar.gz
cd zeromq-4.3.4
./configure --prefix=/usr/local --enable-drafts
make -j$(nproc)
make install

# 安装C++绑定
apt install libzmq3-dev

为什么从源码编译?因为apt源里的版本太旧,而且没有开启draft API。draft API里有几个新特性,比如Server/Client模式,对高频交易很有用。

3.4.2 Redis

Redis用来存行情数据和订单状态。我建议用最新稳定版,老版本有性能问题。

# 安装Redis
apt install redis-server

# 优化配置(/etc/redis/redis.conf)
# 关掉持久化(高频交易不需要)
save ""
# 关掉AOF
appendonly no
# 最大内存
maxmemory 4gb
maxmemory-policy allkeys-lru

注意:关掉持久化意味着机器重启后数据就丢了。但高频交易系统里,Redis只做缓存,数据丢了可以从交易所重新拉。如果你需要持久化,别学我这么干。

3.4.3 Boost

Boost库,说实话我一开始挺抗拒的,因为编译太慢。但后来发现它确实好用,尤其是 boost::asioboost::lockfree

# 安装Boost(只编译需要的模块)
apt install libboost-dev
apt install libboost-system-dev
apt install libboost-thread-dev
apt install libboost-lockfree-dev

如果你需要全部模块:

apt install libboost-all-dev  # 编译时间很长,大概20分钟

3.5 知识体系总览

下面这张图,是我自己总结的高频交易环境搭建的核心逻辑。你看一眼就能明白各个模块之间的关系。

高频交易系统环境搭建核心架构 Linux操作系统(Ubuntu 22.04 LTS) 内核参数调优(网络/内存/延迟) 编译器优化(Clang) 依赖库安装 ZeroMQ Redis Boost 低延迟高频交易系统

3.6 验证环境

装完别急着写代码。先跑个测试,看看延迟能不能接受。

# 测试网络延迟
ping -c 100 -i 0.001 localhost  # 看平均延迟

# 测试ZeroMQ延迟
git clone https://github.com/zeromq/zmq_perf.git
cd zmq_perf
make
./local_thr tcp://127.0.0.1:5555 100 100000
./local_lat tcp://127.0.0.1:5556 100 100000

正常情况,本地延迟应该在1微秒以内。如果超过10微秒,说明哪里没配好。我遇到过一回,折腾半天发现是CPU调频策略没改,默认是省电模式。

检查CPU调频:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 如果是powersave,改成performance
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

好了,环境搭建这块就到这。记住一句话:环境搭得好,后面少踩坑。我当年就是图省事用默认配置,结果上线第一天就出问题,被老板骂惨了。


公众号:蓝海资料掘金营,微信deep3321