4. 在probe中申请PCI BAR区域并映射寄存器
任务说明
本案例目标是通过 ethtool -G 和 ethtool -C 动态修改网卡环形缓冲区(ring buffer)大小与合并参数(coalescing parameters),并验证修改是否生效。环形缓冲区影响网卡收发包的队列深度,合并参数影响中断触发频率与CPU负载,两者均为驱动运行时可调参数,无需重新编译驱动或重启系统。
实现方案
采用最小可复现路径:使用 ethtool 命令行工具直接操作网卡驱动。核心步骤为:查询当前参数 → 修改参数 → 再次查询确认。为验证修改对实际收包路径的影响,使用 ping 产生流量并观察 ethtool -S 中的中断计数与丢包计数变化。本案例不涉及驱动代码修改,聚焦于驱动参数动态配置接口的使用与验证。
操作步骤与代码
1. 查看当前网卡参数
# 查看环形缓冲区当前设置(以 eth0 为例)
ethtool -g eth0
# 查看合并参数当前设置
ethtool -c eth0
预期输出示例(不同驱动/网卡型号数值不同):
# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 512
RX Mini: 0
RX Jumbo: 0
TX: 512
# ethtool -c eth0
Coalesce parameters for eth0:
Adaptive RX: off TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 100
rx-frames: 16
rx-usecs-irq: 0
rx-frames-irq: 0
tx-usecs: 100
tx-frames: 16
tx-usecs-irq: 0
tx-frames-irq: 0
2. 修改环形缓冲区大小
# 将 RX 和 TX 环形缓冲区均修改为 1024
ethtool -G eth0 rx 1024 tx 1024
若驱动不支持指定值,会返回错误信息,此时可尝试设置为预取最大值范围内的其他值(如 256、2048)。
3. 修改合并参数
# 设置 RX 方向:当积累 32 个帧或等待 200 微秒后触发中断
ethtool -C eth0 rx-frames 32 rx-usecs 200
# 设置 TX 方向:当积累 64 个帧或等待 250 微秒后触发中断
ethtool -C eth0 tx-frames 64 tx-usecs 250
4. 验证修改结果
# 确认环形缓冲区修改生效
ethtool -g eth0 | grep -A 5 "Current hardware"
# 确认合并参数修改生效
ethtool -c eth0 | grep -E "rx-frames|rx-usecs|tx-frames|tx-usecs"
预期输出示例:
Current hardware settings:
RX: 1024
RX Mini: 0
RX Jumbo: 0
TX: 1024
rx-usecs: 200
rx-frames: 32
tx-usecs: 250
tx-frames: 64
5. 验证参数对收包路径的实际影响
# 在终端1:持续产生网络流量
ping -f -s 1400 192.168.1.1 # 替换为目标IP,-f 为泛洪模式
# 在终端2:观察中断与丢包计数变化
watch -n 1 'ethtool -S eth0 | grep -E "rx_packets|rx_dropped|interrupts"'
观察要点:
- 修改合并参数后,
interrupts计数增长速度应比修改前明显降低(帧/时间阈值变大,中断频率下降); - 若环形缓冲区设置过小且流量过大,
rx_dropped或rx_missed计数可能增长,说明缓冲区深度不足; - 若设置过大,可能增加内存占用,但通常不会导致丢包。
验证方法与判定标准
| 验证项 | 操作 | 通过标准 |
|---|---|---|
| 环形缓冲区修改 | ethtool -g eth0 | Current hardware 中 RX/TX 值等于设置的 1024 |
| 合并参数修改 | ethtool -c eth0 | rx-frames=32, rx-usecs=200, tx-frames=64, tx-usecs=250 |
| 中断频率变化 | 泛洪 ping 时观察 ethtool -S 的 interrupts 计数 | 修改后 interrupts 增长速度低于修改前(需在相同流量速率下对比) |
| 驱动兼容性 | 执行修改命令时观察返回信息 | 命令无报错,或报错信息明确说明驱动不支持该参数 |
注意事项
- 不同网卡驱动支持的参数范围不同,
ethtool -g输出的 Pre-set maximums 为硬件上限,设置值不得超过该上限; - 部分驱动不支持自适应合并(adaptive coalescing),此时
ethtool -C的 adaptive 相关参数不可用; - 修改为持久化操作需配合
ethtool -G/-C的--persist标志或写入配置文件(如/etc/network/interfaces或 systemd 服务),本案例仅演示运行时动态修改; - 若使用虚拟机或云主机,虚拟网卡(如 virtio、e1000)可能不支持全部参数,请以实际硬件环境为准。