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 eth0Current hardware 中 RX/TX 值等于设置的 1024
合并参数修改ethtool -c eth0rx-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)可能不支持全部参数,请以实际硬件环境为准。
ethtool 动态参数修改验证拓扑 ethtool -G / -C 用户空间命令行 ioctl 内核网络核心 net_device / ethtool_ops 网卡驱动 set_ringparam / set_coalesce 回调 网卡硬件寄存器 Ring Buffer / ITR 配置 MMIO 写入 ethtool -g / -c / -S 读取当前配置与统计 查询 ping -f 泛洪流量 产生持续收包中断 数据包路径 观察中断计数 配置命令 验证命令 测试流量 驱动层 硬件寄存器