网络栈优化:内核网络参数调优(net.core.*)、RPS/RFS、XDP与DPDK入门对比

做量化交易系统,网络延迟就是真金白银。我见过太多团队,算法写得再漂亮,结果网络栈一跑,延迟直接多出几十微秒。今天咱们就聊聊怎么把这部分优化到极致。

一、内核网络参数调优:net.core.* 系列

Linux 内核默认的网络参数,其实是为通用场景设计的。做交易系统,你得手动拧一拧这些旋钮。我个人习惯,先把 /etc/sysctl.conf 里的这几个参数调了。

核心参数速查表

参数 默认值 推荐值 说明
net.core.rmem_default 212992 26214400 接收缓冲区默认大小,调大能减少丢包
net.core.rmem_max 212992 67108864 接收缓冲区最大值,我建议直接拉到 64MB
net.core.wmem_default 212992 26214400 发送缓冲区默认大小
net.core.wmem_max 212992 67108864 发送缓冲区最大值
net.core.netdev_budget 300 600 一次轮询处理的数据包数量
net.core.somaxconn 128 65535 TCP 连接队列长度

为什么调这些?说白了,交易系统在行情爆发时,数据包是井喷的。默认的缓冲区太小,内核会直接丢包。我曾经在实盘环境里遇到过,行情一快,系统就莫名其妙丢 tick 数据。查了半天,发现是 rmem_max 太小了。

我的调优习惯:改完参数后,用 sysctl -p 立即生效。但别在生产环境直接改,先压测验证。

二、RPS/RFS:软中断的负载均衡

多核 CPU 时代,网络中断都挤在一个核上,那就是浪费。RPS(Receive Packet Steering)和 RFS(Receive Flow Steering)就是解决这个问题的。

RPS 的原理:把收到的数据包,通过哈希算法分散到多个 CPU 核心上处理。说白了,就是让软中断不再只压在一个核上。

RFS 更进一步:它不光分散,还考虑数据包应该去哪个核上处理最合适。比如某个连接的应用线程在 CPU2 上跑,RFS 就把这个连接的数据包尽量发到 CPU2 上处理,减少缓存失效。

配置示例:

# 开启 RPS,将 eth0 的队列 0 映射到 CPU 0-3
echo 'f' > /sys/class/net/eth0/queues/rx-0/rps_cpus

# 开启 RFS,设置流表大小
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt

嗯,这里要注意:RPS/RFS 不是万能的。如果你的网卡本身就支持多队列(RSS),那硬件级别的分流比软件更高效。我建议先看网卡是否支持 RSS,不支持再用 RPS 兜底。

避坑指南:我曾经在 40 核的机器上,把 RPS 映射到所有核。结果上下文切换开销反而增加了。后来发现,映射到一半的核效果最好。这个得根据你的业务压测来定。

三、XDP 与 DPDK:用户态网络处理的两种路径

聊到极致优化,就绕不开 XDP 和 DPDK。它们的目标一样——绕过内核协议栈,但路径完全不同。

3.1 XDP:内核里的快车道

XDP(eXpress Data Path)是在内核的网卡驱动层,挂载一个 BPF 程序。数据包还没进协议栈,就被处理了。你可以用它做:

  • DDoS 防御:直接在网卡层面丢弃恶意包
  • 负载均衡:根据源 IP 快速分发
  • 自定义过滤:只保留你关心的行情数据

XDP 的好处是:不需要修改应用代码,通过 ip link 命令就能挂载。而且它和内核协议栈可以共存——处理不了的包,还能放回协议栈继续走。

3.2 DPDK:完全的用户态接管

DPDK(Data Plane Development Kit)更激进。它直接接管网卡,把数据包从硬件 DMA 到用户态内存,完全绕过内核。代价是什么?你得自己写驱动、自己管理内存池、自己处理轮询。

我见过一个做高频交易的朋友,用 DPDK 把行情接收延迟压到了 1 微秒以内。但代价是开发周期长了三倍。

3.3 对比表格

维度 XDP DPDK
延迟 亚微秒级(约 0.5-2μs) 亚微秒级(约 0.2-1μs)
开发难度 中等(BPF 编程) 高(需要写用户态驱动)
与内核共存 可以 不能,独占网卡
适用场景 快速过滤、监控 极致性能、全栈控制
社区生态 Linux 内核原生支持 Intel 主导,生态成熟

四、知识体系总览

下面这张图,是我梳理的网络栈优化知识体系。你可以把它当作一个检查清单。

网络栈优化知识体系 内核参数调优 net.core.* 系列 RPS / RFS 软中断负载均衡 XDP / DPDK 用户态网络处理 关键参数 • rmem_default / rmem_max • wmem_default / wmem_max • netdev_budget / somaxconn 配置要点 • rps_cpus 掩码设置 • rps_sock_flow_entries • 与 RSS 配合使用 选型对比 • XDP:BPF 编程,与内核共存 • DPDK:用户态驱动,独占网卡 • 延迟:DPDK 略优,但开发成本高 实践建议 先调内核参数 → 再考虑 RPS/RFS → 最后评估 XDP/DPDK 每一步都要压测验证,不要盲目上生产 量化交易系统 · 网络栈优化实战

五、选型建议

你想想看,你的交易系统到底需要多低的延迟?

  • 如果延迟要求 10μs 以上:调内核参数 + RPS/RFS 就够了。别折腾 XDP/DPDK,开发成本不划算。
  • 如果延迟要求 1-5μs:可以考虑 XDP。用 BPF 做行情过滤,把不需要的数据包直接扔掉。
  • 如果延迟要求 1μs 以下:那就得上 DPDK 了。但要做好心理准备,开发周期和运维成本都会翻倍。

我的经验:大多数交易系统,调好内核参数 + 用上 RPS,延迟就能降 30%-50%。先做低成本优化,再考虑上重武器。

最后说一句:网络栈优化没有银弹。每个参数、每个技术,都要结合你的业务场景来调。我曾经见过一个团队,花了两周搞 DPDK,结果发现瓶颈在数据库查询上。嗯,先 profiling,再优化,这个顺序不能乱。


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