网口压力测试:丢包错包 + 绑核优化全攻略!
前言
网口作为设备通信的 “关键通道”,尤其在高并发场景下,其稳定性直接决定了业务能否正常推进。但很多时候,大家要么卡在测试环境搭建上,要么对着丢包数据无从下手,更不知道如何通过优化手段提升网口处理效率。
这篇文章没有复杂的理论堆砌,只讲实战:从工具的适配安装、网口双向测试的完整流程,到用 sar 和 ifconfig 精准监控丢包错包,再到能立竿见影的绑核优化技巧,每一步都有具体操作和避坑提示。
一、先搞懂:我们要解决什么问题?
网口是设备与外界通信的 “咽喉”,尤其是高并发场景下,网口压力一旦拉满,很容易出现丢包(数据包丢失) 和错包(数据包内容错误) —— 这不仅会导致数据传输中断,还可能引发业务异常。我们的目标就是:通过标准化测试流程定位问题,再用绑核优化提升网口处理效率,最终实现 “零丢包、低错包” 的测试结果。
二、测试前准备:工具 + 环境搭对是关键
工欲善其事,必先利其器。这次测试的核心工具是netperf(一款专业的网络性能测试工具,支持 UDP/TCP 流测试),环境则需要 “客户端(待测设备)+ 服务端(无网口异常的标准设备)” 一对一对接,具体准备步骤如下:
1. 安装编译 netperf(支持 x86/arm 架构)
首先下载 netperf 包(官网可下),然后根据设备架构编译:
# 解压包
tar -xvf netperf-2.7.0.tar
# 进入目录
cd netperf-2.7.0
# 配置编译(x86架构直接执行,arm架构加--build=arm-linux)
./configure # x86架构
# ./configure --build=arm-linux # arm架构专用
# 编译并安装
make && make install
2. 网口直连 + IP 配置:确保 “通路通畅”
将客户端和服务端的网口一对一物理直连(比如客户端网口 A 连服务端网口 A,网口 B 连网口 B),然后设置相同网段 IP,确保相互 ping 通(这一步别忽略,否则后续测试会直接失败!)。举个实际配置例子:
- 客户端网口 A:IP 10.10.10.10,子网掩码 255.255.255.0,网关 10.10.10.254
- 服务端网口 A:IP 10.10.10.11,子网掩码 255.255.255.0,网关 10.10.10.254
- 客户端网口 B:IP 10.10.20.20,子网掩码 255.255.255.0,网关 10.10.20.254
- 服务端网口 B:IP 10.10.20.21,子网掩码 255.255.255.0,网关 10.10.20.254
三、完整测试流程:从单向到双向,覆盖真实场景
网口在实际使用中会双向传输数据,所以测试不能只测 “单方向”,必须包含单向 UDP 流测试和双向 UDP 流测试(UDP 适合高并发场景,更易暴露丢包问题)。
1. 第一步:服务端开启 netserver(接收端准备)
服务端作为 “接收方”,需要为每个测试网口开启一个独立的端口(4 位数,避免冲突),命令如下:
# 为网口A开启6001端口
netserver -p 6001
# 为网口B开启6002端口
netserver -p 6002
2. 第二步:客户端发送 UDP 流(单向测试)
客户端向服务端发送 UDP 流,持续测试 1 小时(3600 秒),同时将 UDP 包大小设为 1472 字节(这里有个小细节:MTU 默认 1500 字节,减去 IP+UDP 头部 28 字节,1472 字节能避免数据包分片,更贴近真实传输场景)。命令如下:
# 客户端网口A向服务端网口A发送UDP流(端口6001)
netperf -t UDP_STREAM -H 10.10.10.11 -l 3600 -p 6001 -- -M 1472
# 客户端网口B向服务端网口B发送UDP流(端口6002)
netperf -t UDP_STREAM -H 10.10.20.21 -l 3600 -p 6002 -- -M 1472
|
参数 |
作用 |
示例 |
|
-t 类型 |
指定测试类型,决定流量模式 |
-t TCP_STREAM/UDP_STREAM |
|
-H IP |
目标服务器的 IP 地址 |
-H 10.10.10.11 |
|
-l 秒数 |
测试持续时间,直接影响总流量(速率 × 时间) |
-l 3600(持续 3600 秒) |
|
-- -M |
设置 UDP 单包大小(字节) |
-- -M 1472 |
|
-p 端口号 |
指定端口号 |
-p 6001 |
3. 第三步:双向测试(互换角色)
真实场景中数据是双向流动的,所以需要把客户端和服务端角色互换:客户端开启 netserver,服务端发送 UDP 流。
- 客户端开启端口(比如 5001、5002):
netserver -p 5001 netserver -p 5002 - 服务端向客户端发送 UDP 流:
# 服务端网口A向客户端网口A发送(端口5001) netperf -t UDP_STREAM -H 10.10.10.10 -l 3600 -p 5001 -- -M 1472 # 服务端网口B向客户端网口B发送(端口5002) netperf -t UDP_STREAM -H 10.10.20.20 -l 3600 -p 5002 -- -M 1472
四、关键监控:怎么精准算出丢包率、错包率?
测试过程中不能 “瞎跑”,必须实时监控网口状态,才能准确统计丢包、错包情况。我们用了两个核心工具:sar(监控流量)和watch ifconfig -s(监控数据包详情)。
1. sar 工具:实时看网络流量
先安装 sysstat 工具包(包含 sar),然后持续监控网口流量(1 秒刷新一次):
# 安装sysstat
sudo apt install sysstat
# 持续监控网口流量(DEV参数表示监控网络设备)
sar -n DEV 1
通过 sar 输出,能快速判断网口是否处于高负载状态(比如流量是否接近网卡上限)。

2. watch ifconfig -s:看数据包明细
这个命令能实时显示每个网口的 “接收 / 发送数据包统计”,关键参数要记牢:
- RX-OK:接收成功的数据包数
- RX-ERR:接收错误的数据包数(错包来源)
- RX-DRP:接收丢弃的数据包数(丢包来源 1)
- RX-OVR:接收溢出的数据包数(丢包来源 2)
执行命令后,会看到类似这样的输出(以 enaphyt3 网口为例):
Every 2.0s: ifconfig -s
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
enaphyt3 1500 250292 96653 78550 23779 182053 78550 45891 641 0 BMRU
3. 丢包率、错包率怎么算?
有了上面的数据,根据以下公式计算:
- 总接收包数 = RX-OK + RX-ERR + RX-DRP + RX-OVR
- 错包率 = (RX-ERR / 总接收包数) × 100%
- 丢包率 = ((RX-DRP + RX-OVR) / 总接收包数) × 100%
举个例子:如果总接收包数 10000,RX-ERR 10,RX-DRP 20,RX-OVR 5,那么错包率 = 0.1%,丢包率 = 0.25%—— 正常情况下,这两个比例都应该接近 0!
五、核心优化:绑核解决丢包!
如果测试中出现丢包,大概率是 “网口中断处理效率低” 导致的 —— 默认情况下,网口中断会在多个 CPU 核心间切换,频繁切换会浪费资源,导致数据包处理不及时。这时候 “绑核” 就能派上用场:把网口中断绑定到特定 CPU 核心,提升处理效率。
绑核三步曲(以 4 核系统为例,推荐绑 2 或 3 号核心)
第一步:查网口中断号
先找到要优化的网口(比如 enaphyt36i0)对应的中断号,命令:
# 查看enaphyt36i0网口的中断号
cat /proc/interrupts | grep -i enaphyt36i0
# 查看enaphyt36i1网口的中断号(如果有多个网口)
cat /proc/interrupts | grep -i enaphyt36i1
执行后会看到类似输出,其中 “80-87” 就是中断号:

第二步:看当前绑核状态
知道中断号后,查看它当前绑定的核心,命令:
# 87是第一步查到的中断号
cat /proc/irq/87/smp_affinity_list
如果输出是 “2”,说明当前绑定到 2 号核心。
第三步:执行绑核
把中断绑定到 3 号核心(4 核系统推荐 2 或 3 号,避免占用核心 0/1 的系统资源),命令:
# 把87号中断绑定到3号核心
echo 3 > /proc/irq/87/smp_affinity_list
⚠️ 注意:绑核配置会在设备重启后失效,如果需要持久化,需要修改系统配置文件(比如 /etc/rc.local)。
六、补充技巧:用 tc 工具限制带宽
如果需要测试 “低带宽场景下的网口表现”,可以用 tc 工具限制网卡带宽,比如把 eth0 网卡速率限制为 500Mbps:
sudo tc qdisc add dev eth0 root tbf rate 500mbit latency 100ms burst 1540
- rate 500mbit:最大速率 500Mbps
- latency 100ms:传输延迟 100 毫秒
- burst 1540:突发流量最大 1540 字节
总结:
网口压力测试易遇丢包错包问题,本文给出实战解法:用 netperf 适配架构搭建环境,通过双向 UDP 流测试模拟真实场景;借 sar 监控流量、watch ifconfig -s 统计数据,按公式算丢包错包率;若遇丢包,将网口中断绑到闲置 CPU 核心可高效优化,也可通过 tc 工具限制网卡带宽适配低带宽测试场景。
更多推荐


所有评论(0)