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::asio 和 boost::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 知识体系总览
下面这张图,是我自己总结的高频交易环境搭建的核心逻辑。你看一眼就能明白各个模块之间的关系。
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