一、系列简介
2019 年,某头部互联网公司在线上大促期间遭遇严重的网络瓶颈:单台服务器的吞吐量卡在 40Gbps 上不去,CPU 利用率却已经飙到 90%。网络团队排查发现,瓶颈不在硬件,而在 Linux 内核协议栈。从那时起,“内核旁通”这个词开始频繁出现在基础设施团队的议事日程上。
本系列从**内核旁通(Kernel Bypass)**的核心思路出发,系统剖析现代高性能网络与系统底层技术。当你用 socket() 收发数据时,数据包要穿越中断处理、软中断、协议栈解析、系统调用、内存拷贝等层层关卡,单核吞吐量很难突破 1~2 Mpps。而在高频交易、电信级转发、云虚拟网络、分布式存储等场景中,这个数字远远不够。
内核旁通(Kernel Bypass)技术的核心思路是:绕过内核协议栈,让用户态程序直接接管数据平面。DPDK 把网卡收发包拉到用户态轮询处理,XDP/eBPF 在内核最早期路径挂载可编程逻辑,RDMA 让两台机器的内存直接互访,SPDK 把存储 I/O 也拉到用户态,io_uring 用共享环形队列消除系统调用开销。这些技术不是孤立的,它们共享同一套理念:减少上下文切换、消除不必要的数据拷贝、用轮询替代中断、用无锁结构替代内核锁。
本系列覆盖 15 个章节,从”为什么内核网络慢”到”内核旁通技术全景”,再到 DPDK 五章深入、XDP/eBPF、SPDK、RDMA、SmartNIC/DPU、OVS-DPDK、VPP、io_uring,最后以综合实战收尾。每章配有可编译运行的代码示例与性能基准数据,让你从”会用网络 API”进阶到”掌控数据平面性能”。
二、场景驱动阅读路线
不想按部就班从第 1 章读到第 15 章?以下 5 条路线从你日常遇到的真实问题出发,按”瓶颈在哪→怎么旁通→如何优化”的顺序串联章节。每条路线可独立阅读,前置依赖已在路线内标注。
路线总览
路线A:我的网络应用为什么慢
场景:你的网络服务 P99 延迟居高不下,
perf top显示大量时间花在软中断和内核协议栈,单核吞吐量卡在 1 Mpps 上不去。问题到底出在哪?能不能绕过去?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch01 内核网络栈的性能瓶颈 | 定位瓶颈:中断开销、协议栈解析、系统调用、内存拷贝——理解”为什么内核网络慢” |
| 2 | Ch02 内核旁通技术全景 | 全景地图:DPDK/XDP/RDMA/SPDK/io_uring 各自绕过了哪些瓶颈、适用什么场景 |
| 3 | Ch03 DPDK架构全景与核心概念 | DPDK 入口:用户态轮询驱动模型、EAL 抽象层、rte_ring 无锁队列——理解 DPDK 的设计哲学 |
| 4 | Ch04 DPDK内存管理 | 大页内存、mempool、mbuf 结构——DPDK 性能的地基是零拷贝内存管理 |
| 5 | Ch07 DPDK多核与并发模型 | 多核扩展:RSS 哈希分流、lcore 绑核、无锁数据结构——从单核到多核的线性扩展 |
路线逻辑:先定位瓶颈(Ch01),再了解旁通全景(Ch02),然后深入最成熟的旁通方案 DPDK,从架构(Ch03)到内存(Ch04)到多核(Ch07),掌握”绕过内核做高性能网络”的完整路径。
路线B:云环境虚拟网络加速
场景:OpenStack/OVN 虚拟网络延迟高、OVS 内核态转发成为瓶颈、租户间隔离与性能难以兼顾。云厂商是怎么用 DPDK + SmartNIC 把虚拟交换做到线速的?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch03 DPDK架构全景与核心概念 | 理解 DPDK 用户态轮询模型——OVS-DPDK 的性能根基 |
| 2 | Ch05 DPDK轮询模式驱动 | PMD 工作原理:轮询收包、批量处理、向量化的收发包优化——OVS-DPDK 的数据面引擎 |
| 3 | Ch12 OVS-DPDK与虚拟交换 | 核心:OVS-DPDK 数据路径、vhost-user 虚拟机收发包、流表匹配与缓存——云网络加速的工业级方案 |
| 4 | Ch11 SmartNIC与DPU | 卸载到硬件:OVS 流表卸载到 SmartNIC、DPU 的可编程数据平面——虚拟网络加速的下一步 |
路线逻辑:先掌握 DPDK 基础(Ch03→Ch05),再理解 OVS-DPDK 如何用 DPDK 加速虚拟交换(Ch12),最后看 SmartNIC/DPU 如何把转发逻辑卸载到硬件(Ch11)。
路线C:存储性能极限
场景:NVMe SSD 延迟已经低到微秒级,内核块设备栈的开销反而成了瓶颈。SPDK 怎么把存储 I/O 拉到用户态?RDMA 怎么让远程存储访问像本地访问一样快?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch02 内核旁通技术全景 | 理解旁通技术的共性——存储旁通与网络旁通共享同一套理念:消除上下文切换和数据拷贝 |
| 2 | Ch09 SPDK与存储旁通 | 核心:SPDK NVMe 驱动、bdev 框架、vhost-blk/scsi、BlobStore——用户态存储栈全貌 |
| 3 | Ch10 RDMA与远程直接内存访问 | 绕过远程 CPU:RoCE/iWARP 协议、Verbs API、RDMA 在分布式存储中的应用——NVMe-oF 的传输基础 |
路线逻辑:先建立旁通技术的共性认知(Ch02),再深入存储旁通方案 SPDK(Ch09),然后理解 RDMA 如何让远程存储绕过远端 CPU(Ch10)。
路线D:内核态高性能方案
场景:你的场景不适合完全旁通内核——需要与内核协议栈协作、需要可编程的包处理逻辑、或者只是想让异步 I/O 更快。XDP/eBPF 和 io_uring 是什么?能解决什么问题?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch02 内核旁通技术全景 | 理解旁通谱系:完全旁通(DPDK/SPDK)vs 内核态加速(XDP/io_uring)的定位差异 |
| 2 | Ch08 XDP与eBPF高性能网络 | 核心:XDP 在网卡驱动层的早期处理、eBPF 程序的验证与 JIT、tc/BPF 与 XDP 的协作——不离开内核的高性能网络 |
| 3 | Ch14 io_uring与异步IO革命 | 共享环形队列、批量提交、零拷贝收发——io_uring 如何把 Linux 异步 I/O 推向新高度 |
路线逻辑:先理解旁通谱系的全景(Ch02),再深入两种内核态高性能方案:XDP/eBPF 处理网络包(Ch08),io_uring 处理异步 I/O(Ch14)。
路线E:全栈高性能网络系统
场景:你要构建一个电信级 vEPC/UPF、5G 数据面、或高性能软件路由器。需要 DPDK 收发包、VPP 做图节点处理、多核线性扩展,最后端到端验证性能。这是完整的数据平面工程师路线。
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch03 DPDK架构全景与核心概念 | DPDK 架构与 EAL——高性能数据平面的基础设施 |
| 2 | Ch04 DPDK内存管理 | 大页、mempool、mbuf——零拷贝的内存基础 |
| 3 | Ch05 DPDK轮询模式驱动 | PMD 收发包、向量化——数据面吞吐的核心引擎 |
| 4 | Ch06 DPDK数据平面核心机制 | rte_ring、rte_hash、ACL/FIB——数据面处理的核心数据结构与算法 |
| 5 | Ch07 DPDK多核与并发模型 | RSS 分流、lcore pipeline/run-to-completion——多核扩展策略 |
| 6 | Ch13 VPP与FD.io数据平面 | 核心:VPP 图节点架构、插件机制、与 DPDK 的集成——工业级数据平面框架 |
| 7 | Ch15 综合实战 | 端到端:构建高性能软件路由器/UPF,性能调优与基准测试——全系列知识的综合运用 |
路线逻辑:这是最完整的路线,从 DPDK 基础(Ch03→Ch04→Ch05)到数据平面核心机制(Ch06)到多核扩展(Ch07),再用 VPP 构建工业级数据平面(Ch13),最后综合实战(Ch15)。
路线交叉参考
同一章节在不同路线中的关注点不同:
| 章节 | 路线A 关注点 | 路线B 关注点 | 路线C 关注点 | 路线D 关注点 | 路线E 关注点 |
|---|---|---|---|---|---|
| Ch01 | 核心:瓶颈定位 | — | — | — | — |
| Ch02 | 旁通全景 | — | 旁通共性理念 | 旁通谱系定位 | — |
| Ch03 | DPDK 设计哲学 | DPDK 基础 | — | — | DPDK 架构 |
| Ch04 | 零拷贝内存 | — | — | — | 大页/mempool |
| Ch05 | — | PMD 收发包 | — | — | 向量化引擎 |
| Ch06 | — | — | — | — | 数据结构/算法 |
| Ch07 | 多核扩展 | — | — | — | 多核策略 |
| Ch08 | — | — | — | 核心:XDP/eBPF | — |
| Ch09 | — | — | 核心:SPDK | — | — |
| Ch10 | — | — | RDMA 远程存储 | — | — |
| Ch11 | — | SmartNIC 卸载 | — | — | — |
| Ch12 | — | 核心:OVS-DPDK | — | — | — |
| Ch13 | — | — | — | — | 核心:VPP |
| Ch14 | — | — | — | 核心:io_uring | — |
| Ch15 | — | — | — | — | 综合实战 |
三、知识导图
以下导图展示 16 章知识之间的网络关系。与线性目录不同,这里强调跨技术的连接——DPDK 的内存管理与 SPDK 共享大页理念,XDP 的 eBPF 程序与 io_uring 共享内核可编程基础设施,RDMA 与 DPDK 共享零拷贝与 CPU 亲和性设计。
概念关系图
章节网络关系图
知识关联参考表
按三层模型组织:用户可见层(你日常接触的概念)→ 高性能机制层(旁通技术如何实现)→ 共享基础设施层(所有旁通技术的共同地基)。同一行的条目之间存在直接的知识依赖或概念映射。
| 用户可见概念 | 对应章节 | 高性能机制 | 对应章节 | 共享基础 | 对应章节 |
|---|---|---|---|---|---|
| 网络应用低延迟 | Ch01 | DPDK 用户态轮询 | Ch03, Ch05 | 大页内存 + CPU 亲和性 | Ch04, Ch07 |
| 虚拟交换线速转发 | Ch12 | OVS-DPDK 数据路径 | Ch12 | PMD 收发包 + 无锁队列 | Ch05, Ch06 |
| 软件路由器/UPF | Ch13 | VPP 图节点处理 | Ch13 | DPDK 收发包 + 多核扩展 | Ch05, Ch07 |
| 分布式存储低延迟 | Ch09 | SPDK NVMe 用户态驱动 | Ch09 | 大页内存 + 轮询模式 | Ch04 |
| 远程存储高速访问 | Ch10 | RDMA Verbs + RoCE | Ch10 | 零拷贝 + CPU 亲和性 | Ch04 |
| DDoS 防护/负载均衡 | Ch08 | XDP 早期丢包/转发 | Ch08 | 零拷贝 + eBPF 可编程 | Ch02 |
| 云网络硬件卸载 | Ch11 | SmartNIC 流表卸载 | Ch11 | OVS-DPDK + 可编程数据面 | Ch12 |
| 高并发异步 I/O | Ch14 | io_uring 共享环形队列 | Ch14 | 零拷贝 + 批量提交 | Ch02 |
| 数据包快速查找 | Ch06 | rte_hash / FIB / ACL | Ch06 | 无锁结构 + 大页 | Ch04 |
| 多核线性扩展 | Ch07 | RSS + lcore 绑核 | Ch07 | CPU 亲和性 + 无锁队列 | Ch06 |
| 内核协议栈瓶颈定位 | Ch01 | 中断/软中断/拷贝分析 | Ch01 | 性能观测方法论 | Ch01 |
| 旁通技术选型 | Ch02 | DPDK/XDP/RDMA/SPDK 对比 | Ch02 | 旁通共性理念 | Ch02 |
四、系列大纲
以下是按章节编号排列的完整目录。建议结合上方的场景驱动阅读路线和知识导图选择适合你的阅读顺序。
| 章节 | 标题 | 核心内容 |
|---|---|---|
| 0 | 系列导读 | 系列定位、场景路线、知识导图、环境搭建 |
| 1 | 内核网络栈的性能瓶颈 | 中断开销、软中断处理、协议栈解析、系统调用、内存拷贝、性能基准测量 |
| 2 | 内核旁通技术全景 | DPDK/XDP/RDMA/SPDK/io_uring 谱系、旁通共性理念、选型决策树 |
| 3 | DPDK架构全景与核心概念 | EAL 抽象层、用户态轮询模型、rte_ring 无锁队列、DPDK 构建系统 |
| 4 | DPDK内存管理 | 大页内存、mempool、mbuf 结构、物理内存映射、零拷贝设计 |
| 5 | DPDK轮询模式驱动 | PMD 工作原理、轮询收包、批量处理、向量化收发包、多队列 |
| 6 | DPDK数据平面核心机制 | rte_ring、rte_hash、ACL/FIB 查找、数据包分发、计时器与周期任务 |
| 7 | DPDK多核与并发模型 | RSS 哈希分流、lcore 绑核、pipeline/run-to-completion、无锁数据结构 |
| 8 | XDP与eBPF高性能网络 | XDP 早期处理、eBPF 验证器与 JIT、tc/BPF 协作、XDP vs DPDK 选型 |
| 9 | SPDK与存储旁通 | SPDK NVMe 驱动、bdev 框架、vhost-blk/scsi、BlobStore、NVMe-oF |
| 10 | RDMA与远程直接内存访问 | RoCE/iWARP 协议、Verbs API、QP/CQ/MR、RDMA 在分布式存储中的应用 |
| 11 | SmartNIC与DPU | SmartNIC 流表卸载、DPU 可编程数据平面、OVS 硬件卸载、P4 编程 |
| 12 | OVS-DPDK与虚拟交换 | OVS-DPDK 数据路径、vhost-user、流表匹配与缓存、emc/ukey |
| 13 | VPP与FD.io数据平面 | VPP 图节点架构、插件机制、与 DPDK 集成、性能调优 |
| 14 | io_uring与异步IO革命 | 共享环形队列、批量提交、零拷贝收发、io_uring 与 DPDK 的协作 |
| 15 | 综合实战 | 构建高性能软件路由器/UPF,端到端性能调优与基准测试 |
五、开发环境搭建
以下环境搭建步骤基于 Ubuntu 22.04 LTS。其他发行版(CentOS/RHEL/Fedora)的包名和路径可能不同,请参考各项目的官方文档。部分实验需要物理网卡和特定硬件(如 RDMA 网卡、SmartNIC),虚拟机环境下功能可能受限。
DPDK 开发环境
# 安装编译依赖sudo apt install build-essential meson ninja-build pkg-config libnuma-dev
# 下载 DPDK 源码git clone https://dpdk.org/git/dpdkcd dpdk
# 使用 meson 构建meson setup buildninja -C buildsudo ninja -C build install
# 配置大页内存(DPDK 运行必需)# 方式一:2MB 大页(需要 1024 页 = 2GB)echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# 方式二:1GB 大页(更高效,需要重启)# 在内核命令行添加:default_hugepagesz=1G hugepagesz=1G hugepages=4
# 挂载 hugetlbfs(通常已自动挂载)sudo mkdir -p /dev/hugepagessudo mount -t hugetlbfs nodev /dev/hugepages
# 绑定网卡到 DPDK 兼容驱动(vfio-pci)sudo modprobe vfio-pcisudo dpdk-devbind.py --bind=vfio-pci <pci-address>
# 验证安装dpdk-testpmd -l 0-3 -n 4 -- -iSPDK 开发环境
# 安装编译依赖sudo apt install libaio-dev libiscsi-dev libncurses5-dev librdmacm-dev
# 下载 SPDK 源码git clone https://github.com/spdk/spdkcd spdk
# 安装依赖(SPDK 提供的自动化脚本)sudo scripts/pkgdep.sh
# 编译./configure --with-dpdk=/path/to/dpdkmake -j$(nproc)
# 设置大页(与 DPDK 共享)echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# 绑定 NVMe 设备到用户态驱动sudo scripts/setup.sh
# 验证安装build/bin/spdk_nvme_identify -i 0RDMA 开发环境
# 安装 RDMA 工具和开发库sudo apt install rdma-core libibverbs-dev librdmacm-dev ibverbs-utils perftest
# 加载 RDMA 驱动(Mellanox/NVIDIA 网卡)sudo modprobe mlx5_coresudo modprobe mlx5_ib
# 验证 RDMA 设备ibv_devinfo
# 性能测试(需要两台机器)# 服务端ib_send_bw -d mlx5_0# 客户端ib_send_bw -d mlx5_0 <server-ip>io_uring 开发环境
# 安装 liburinggit clone https://github.com/axboe/liburingcd liburingmake -j$(nproc)sudo make install
# 确认内核版本(io_uring 需要 5.1+,推荐 5.10+)uname -r
# 验证 io_uring 可用cat /proc/sys/kernel/io_uring_disabled# 输出 0 表示可用
# 编译测试程序gcc -o io_uring_test io_uring_test.c -luringXDP/eBPF 开发环境
# 安装 eBPF 开发工具sudo apt install clang llvm bpftool linux-headers-$(uname -r)
# 安装 libbpfgit clone https://github.com/libbpf/libbpfcd libbpf/srcmake -j$(nproc)sudo make install
# 验证 BPF 可用bpftool prog listbpftool map list
# 编译 XDP 程序示例clang -O2 -g -target bpf -c xdp_prog.c -o xdp_prog.o
# 加载 XDP 程序到网卡sudo ip link set dev <interface> xdpgeneric obj xdp_prog.o sec xdpDPDK 和 SPDK 共享大页内存基础设施。如果你同时搭建两者,只需配置一次大页。RDMA 的 Verbs API 与 DPDK 的内存注册机制有概念上的对应关系,理解 DPDK 内存管理后再学 RDMA 会更顺畅。
六、本系列的实践方法论
本系列遵循 观察 → 基准 → 旁通 → 验证 的学习方法:
- 观察:用
perf、sar、/proc/interrupts、ethtool -S等工具观察内核网络栈的行为,定位性能瓶颈所在 - 基准:用
pktgen、iperf3、dpdk-procinfo等工具建立性能基线,量化”当前有多慢” - 旁通:选择合适的旁通技术(DPDK/XDP/RDMA/SPDK/io_uring),编写代码绕过内核瓶颈
- 验证:对比旁通前后的性能数据,确认瓶颈是否消除,分析新的瓶颈在哪里
每章的「动手实践」部分都遵循这一方法论。先测量再优化,用数据说话,而不是凭感觉调参。
旁通技术是把双刃剑。绕过内核意味着你放弃了内核提供的安全保护、流量控制、协议处理等机制。在生产环境中使用旁通技术前,务必理解其安全边界和运维代价。本系列在每章都会标注相关风险。
七、推荐参考资料
经典教材
| 书籍 | 作者 | 特点 |
|---|---|---|
| 《DPDK Application Development Guide》 | DPDK 社区 | DPDK 官方开发指南,API 参考与最佳实践 |
| 《Systems Performance》 | Brendan Gregg | 性能分析与可观测性的百科全书,旁通技术的观测方法论基础 |
| 《Linux Kernel Networking》 | Rami Rosen | 内核网络栈实现详解,理解”为什么内核网络慢”的必备参考 |
| 《RDMA Aware Networks Programming Manual》 | Mellanox/NVIDIA | RDMA Verbs API 的权威参考 |
| 《SPDK Programming Guide》 | SPDK 社区 | SPDK 官方开发指南,存储旁通的核心文档 |
| 《BPF Performance Tools》 | Brendan Gregg | eBPF 性能工具全书,XDP/eBPF 的实践参考 |
在线资源
- DPDK 官方文档 — DPDK 各版本的 API 文档与编程指南
- FD.io VPP Wiki — VPP 图节点架构与插件开发文档
- SPDK 官方文档 — SPDK 架构设计与开发指南
- Linux RDMA 文档 — RDMA 编程教程与示例
- io_uring Wiki — io_uring 接口说明与使用示例
- eBPF.io — eBPF 生态全景,包含 XDP、Cilium 等项目介绍
- Brendan Gregg’s Linux Performance — 性能分析参考
性能测试工具
- dpdk-testpmd:DPDK 自带的包转发测试工具,验证 PMD 收发包性能
- pktgen-dpdk:基于 DPDK 的高性能流量生成器
- TRex:Cisco 开源的高性能流量生成器,支持 DPDK
- ib_send_bw / ib_write_bw:RDMA 带宽与延迟基准测试
- spdk_nvme_perf:SPDK NVMe 性能基准测试
- fio + io_uring:io_uring 存储性能基准测试
- bpftool:eBPF/XDP 程序加载、查看、统计
准备好开始了吗?从 内核网络栈的性能瓶颈 开始你的高性能网络之旅吧!
参考
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






