3. 测试环境搭建:Linux内核版本选择、编译内核开启网络测试选项、安装必要工具链
搭建一个可靠、可复现的内核网络性能测试环境,是进行 pktgen 与 netperf 压测的前提。本章将指导你完成从内核版本选择、内核编译配置到工具链安装的全流程,确保底层内核支持网络测试所需的统计、延迟与丢包追踪能力。
3.1 内核版本选择策略
不同内核主线版本在网络子系统、pktgen 模块特性及 netperf 依赖的套接字性能上存在差异。建议根据测试目标选择长期支持(LTS)或主线稳定版。
| 内核系列 | 推荐版本 | 适用场景 | pktgen 支持 | 网络栈特性 |
|---|---|---|---|---|
| LTS 长期支持 | 5.10.x / 5.15.x / 6.1.x | 生产环境压测、回归测试 | 完整 | 稳定,已修复大部分网络锁竞争 |
| 主线稳定 | 6.6.x / 6.7.x | 新特性验证、XDP/eBPF 压测 | 完整 + 扩展统计 | 含最新 TCP BBR、RPS/RFS 优化 |
| 长期测试 (SLT) | 6.12.x (2025年) | 前瞻性性能评估 | 完整 + 多队列扩展 | 支持多队列 pktgen 并发 |
选版建议: 对于本课程所有实验,推荐使用 Linux 6.1.x LTS。该版本在 pktgen 稳定性、netperf 兼容性以及内核编译选项的完整性上表现均衡,且社区维护周期长。
3.2 编译内核:开启网络测试关键选项
发行版预编译内核通常裁剪了调试与测试接口。为了获取完整的网络统计、延迟追踪和 pktgen 功能,必须从源码编译内核,并显式开启以下配置项。
3.2.1 获取内核源码
# 以 6.1.55 LTS 为例
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.55.tar.xz
tar -xf linux-6.1.55.tar.xz
cd linux-6.1.55
3.2.2 核心网络测试配置项
执行 make menuconfig 后,按以下路径开启选项。下表列出必须启用的关键开关:
| 配置项 | 路径 (make menuconfig) | 作用 | 推荐值 |
|---|---|---|---|
| CONFIG_NET_PKTGEN | Device Drivers → Network device support → Pktgen | 启用内核态高速发包生成器 | 内置 (y) |
| CONFIG_NET_SCHED | Networking support → Networking options → QoS and/or fair queueing | 支持 netem 延迟/丢包模拟 | 内置 (y) |
| CONFIG_NET_CLS_ACT | Networking support → Networking options → Traffic control | 支持 tc 过滤器与动作 | 内置 (y) |
| CONFIG_NET_DROP_MONITOR | Networking support → Networking options → Network drop monitor | 跟踪内核丢包位置与原因 | 模块 (m) |
| CONFIG_NET_SCH_NETEM | Networking support → Networking options → QoS → NETEM | 网络模拟器(延迟/抖动/丢包) | 模块 (m) |
| CONFIG_NET_9P | Networking support → 9P virtio 支持 | 虚拟化场景下网络测试 | 按需 |
| CONFIG_DEBUG_NET | Kernel hacking → Networking → Network debugging | 网络栈额外调试与统计 | 内置 (y) |
常见遗漏: 许多开发者只开启 CONFIG_NET_PKTGEN,却遗漏 CONFIG_NET_SCH_NETEM 和 CONFIG_NET_DROP_MONITOR。这会导致后续 netperf 结合 netem 模拟弱网场景时无法加载模块,或丢包定位时无日志输出。
3.2.3 编译与安装
# 配置内核(基于当前系统配置 + 手动调整)
make olddefconfig
make menuconfig # 手动开启上述选项
# 编译(根据CPU核心数调整 -j 参数)
make -j$(nproc)
# 安装模块与内核
sudo make modules_install
sudo make install
# 更新引导
sudo update-grub
# 重启选择新内核
sudo reboot
3.3 安装必要工具链
编译内核和运行测试需要完整的 C 编译环境、版本控制工具及测试套件。以下为最小安装清单:
| 工具/库 | 版本要求 | 安装命令 (Debian/Ubuntu) | 用途 |
|---|---|---|---|
| gcc | ≥ 10.x | sudo apt install gcc | 编译内核与 netperf |
| make | ≥ 4.3 | sudo apt install make | 构建系统 |
| git | ≥ 2.30 | sudo apt install git | 管理内核源码与补丁 |
| flex / bison | 最新 | sudo apt install flex bison | 内核配置解析 |
| libelf-dev | ≥ 0.186 | sudo apt install libelf-dev | 内核模块 ELF 处理 |
| openssl-dev | ≥ 1.1.1 | sudo apt install libssl-dev | 内核签名与证书 |
| pkg-config | 最新 | sudo apt install pkg-config | 库依赖检测 |
验证安装: 执行以下命令确认版本符合要求:
gcc --version | head -n1make --version | head -n1git --version
3.4 环境搭建流程总览
下图展示了从裸机/虚拟机到可执行 pktgen 与 netperf 压测的完整环境搭建步骤:
3.5 验证内核配置是否生效
重启进入新内核后,执行以下命令确认关键模块已加载或可加载:
# 确认内核版本
uname -r
# 输出应为:6.1.55-custom
# 检查 pktgen 模块是否可用
lsmod | grep pktgen
# 若未加载,手动加载
sudo modprobe pktgen
# 检查 netem 模块
modinfo sch_netem
# 检查 drop monitor
ls /sys/kernel/debug/drop_monitor
# 若存在,说明 CONFIG_NET_DROP_MONITOR 已生效
快速验证 pktgen: 执行
cat /proc/net/pktgen/kpktgend_0,若输出包含 Name: pktgen 且无错误,说明内核 pktgen 已就绪,可以进入下一章的压测实验。
3.6 常见问题与避坑
- 编译报错: 缺少
libelf-dev或openssl-dev会导致make中断。按 3.3 节安装所有依赖后重试。 - pktgen 无法加载: 确认
CONFIG_NET_PKTGEN为y(内置)而非m(模块)。模块化可能导致 initramfs 中缺失。 - netperf 编译失败: 确保系统已安装
libnl-3-dev和libnl-route-3-dev,netperf 的 TCP 连接数测试依赖 netlink。 - 虚拟机嵌套: 若在虚拟机中编译内核,分配至少 2 核 4GB 内存,否则
make -j$(nproc)可能因 OOM 被杀。