3、操作系统选型与安装:Linux发行版对比(Ubuntu/CentOS/RHEL)、最小化安装、内核参数调优、用户权限管理
做量化交易系统,操作系统是地基。地基没打好,上层策略再牛也白搭。我见过太多团队,策略回测跑得飞起,一上实盘就各种卡顿、延迟爆炸。查到最后,往往是操作系统层面出了问题。
今天咱们就聊聊,怎么选一个靠谱的Linux发行版,怎么装得干净利落,怎么把内核调得服服帖帖。
3.1 发行版怎么选?Ubuntu、CentOS还是RHEL?
这个问题,几乎每个刚入行的朋友都会问我。我的回答是:看你的场景和团队能力。
先看一张对比表,心里有个底:
| 特性 | Ubuntu | CentOS | RHEL |
|---|---|---|---|
| 包管理 | apt(deb包) | yum/dnf(rpm包) | yum/dnf(rpm包) |
| 稳定性 | 中高(LTS版本) | 高 | 极高 |
| 软件新度 | 较新 | 保守 | 保守 |
| 商业支持 | 社区为主 | 社区为主(已停止维护) | 官方付费支持 |
| 适合场景 | 开发环境、中小团队 | 生产环境(历史原因) | 大型机构、合规要求高 |
我个人习惯:开发机用Ubuntu LTS,生产环境用RHEL或Rocky Linux(CentOS的替代品)。为什么?
- Ubuntu:社区活跃,软件包新。你装个Python 3.11、GCC 12,apt一下就行。对量化开发来说,省心。我在项目中遇到过,用Ubuntu装一些最新的机器学习库,几乎没遇到依赖冲突。
- CentOS:曾经是生产环境的首选。但2021年底CentOS 8停止维护,CentOS 7也快到头了。现在再用它,有点「49年入国军」的意思。不推荐。
- RHEL:贵,但稳。如果你在券商、银行做量化,合规要求严,必须买商业支持。RHEL的内核经过红帽深度定制,对内存管理、网络栈的优化很到位。说白了,花钱买安心。
3.2 最小化安装:少即是多
很多新手装系统,喜欢「全选」。桌面环境、办公套件、游戏组件……一股脑全装上。结果呢?系统臃肿,后台服务一堆,安全漏洞也多。
做量化交易,尤其是高频场景,系统越干净越好。你想想看,一个没用的进程,可能就抢了你几微秒的CPU时间。在纳秒级竞争里,这差距就大了。
最小化安装的原则就一条:只装你需要的。
具体怎么做?
- 安装时选择「Server」或「Minimal」:Ubuntu Server版默认就不带桌面。CentOS/RHEL安装时选「Minimal Install」。
- 装完后,检查并清理无用包:
# Ubuntu/Debian
sudo apt list --installed | grep -E 'snap|thunderbird|libreoffice'
sudo apt remove --purge 包名
# CentOS/RHEL/Rocky
sudo dnf groupremove "GNOME Desktop" "X Window System"
sudo dnf remove cups* postfix*
我曾经帮一个团队排查延迟问题。他们的交易服务器上,竟然跑着cups打印服务。一问,是当初装系统时默认勾上的。关了之后,平均延迟降了5%。嗯,细节决定成败。
3.3 内核参数调优:让系统为交易而生
Linux内核默认配置,是为了通用场景设计的。做量化交易,我们需要它更「激进」一些。说白了,就是牺牲一些公平性,换取低延迟。
核心调优参数,我列几个最关键的:
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
| net.core.rmem_max | 212992 | 134217728 | 增大接收缓冲区,防止丢包 |
| net.core.wmem_max | 212992 | 134217728 | 增大发送缓冲区 |
| net.ipv4.tcp_rmem | 4096 87380 6291456 | 4096 87380 134217728 | TCP接收窗口调大 |
| net.ipv4.tcp_wmem | 4096 16384 4194304 | 4096 87380 134217728 | TCP发送窗口调大 |
| vm.swappiness | 60 | 10 | 减少内存交换,优先使用物理内存 |
| kernel.sched_migration_cost_ns | 500000 | 5000000 | 减少进程迁移,提高CPU亲和性 |
怎么应用?直接改 /etc/sysctl.conf 文件:
# 备份原文件
sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak
# 追加以下内容
cat >> /etc/sysctl.conf << EOF
# 网络优化
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 87380 134217728
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
# 调度优化
kernel.sched_migration_cost_ns = 5000000
kernel.sched_autogroup_enabled = 0
EOF
# 立即生效
sudo sysctl -p
这里有个坑。我曾经把 vm.swappiness 直接设成0,结果系统内存吃紧时,直接OOM杀进程。后来改成10,既减少了交换,又留了缓冲。嗯,别走极端。
3.4 用户权限管理:安全第一
量化交易系统里,跑的是真金白银。权限管理搞不好,一个误操作就能让你亏到哭。
基本原则:最小权限原则。每个用户、每个进程,只给够用的权限。
我一般这样划分:
- root:只用于系统安装和维护。日常操作禁用root登录。
- trade:交易策略运行用户。权限最小化,只能访问策略目录和日志。
- data:数据采集和存储用户。只能读写数据目录。
- admin:运维人员。可以通过sudo执行特定命令。
创建用户的命令:
# 创建交易用户,没有家目录,不能登录
sudo useradd -r -s /sbin/nologin -M trade
# 创建数据用户
sudo useradd -r -s /sbin/nologin -M data
# 创建管理员用户
sudo useradd -m -G wheel admin
sudo passwd admin
然后,用 sudoers 文件精细控制权限:
# 允许admin用户重启交易服务,无需密码
admin ALL=(trade) NOPASSWD: /usr/bin/systemctl restart trade.service
# 允许admin用户查看系统日志
admin ALL=(root) /usr/bin/journalctl
另外,SSH安全配置也很重要:
# 编辑 /etc/ssh/sshd_config
PermitRootLogin no # 禁止root登录
PasswordAuthentication no # 禁止密码登录,只用密钥
Port 2222 # 改掉默认22端口,减少扫描
AllowUsers admin # 只允许特定用户登录
# 重启服务
sudo systemctl restart sshd
这样做的好处是,即使有人扫到了你的服务器,也基本进不来。我有个朋友,服务器天天被扫,改了端口和密钥登录后,再也没被成功登录过。
3.5 本章知识体系
下面这张图,帮你理清本章的核心逻辑:
好了,操作系统这块地基,咱们算是打好了。下一章,咱们聊聊网络环境怎么搭。毕竟,交易系统最怕的就是网络延迟。