查当前ring buffer大小用ethtool -g eth0,输出中current hardware settings下的rx/tx值即为当前深度,常见默认256或512,高并发udp小包场景常不足。

查当前 Ring Buffer 大小用 ethtool -g
直接运行 ethtool -g eth0(把 eth0 换成你实际的网卡名),输出里会显示:Current hardware settings 下的 RX 和 TX 值,这就是当前 Ring Buffer 的深度。常见默认值是 256 或 512,对高并发 UDP 小包场景明显不够。
注意:ethtool -g 只显示当前设置,不反映是否已达硬件上限;有些网卡(如 ixgbe)最大支持 4096 或 8192,但 igb 可能只到 4096,得查对应驱动文档确认。
常见误操作:ethtool -G eth0 rx 8192 执行失败时,别硬试更大值——先看 ethtool -g eth0 输出里的 Max 行,只允许设在 Min~Max 范围内。
确认丢包是否来自 Ring Buffer 溢出
真正要定位问题,不能只看 ifconfig 或 netstat -i 里的 overruns,它只是最终结果。得结合两处统计交叉验证:
-
cat /proc/net/dev中对应网卡行的fifo列:非零说明 Ring Buffer 溢出已发生 -
ethtool -S eth0 | grep -i "rx_fifo\|rx_missed\|rx_no_buffer":重点看rx_fifo_errors(FIFO 溢出)、rx_missed_errors(DMA 缓冲区满、驱动没及时取走)、rx_no_buffer_count(SKB 分配失败)
如果 rx_fifo_errors 持续上涨,而 UdpOverflows(来自 netstat -s | grep Udp)增长缓慢,基本可断定丢包卡在 Ring Buffer 层,还没进协议栈。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
ethtool -G 调大 RX Ring Buffer 的实操要点
调大本身很简单:ethtool -G eth0 rx 4096,但容易忽略几个关键点:
- 必须用 root 权限执行,普通用户会报
Operation not permitted - 部分虚拟化环境(如
virtio_net)不支持动态调整,ethtool -S eth0可能返回no stats available,此时需改用virsh edit调整 vNIC 配置或换物理网卡 - 增大后要验证是否生效:
ethtool -g eth0再跑一次,确认Current值已更新 - TX Ring Buffer 对 UDP 接收无影响,一般无需调大;强行设大可能浪费内存,还可能触发某些驱动 bug
临时生效后务必做持久化:写入 /etc/rc.local(Debian/Ubuntu)或添加 POST_UP_CMD="ethtool -G eth0 rx 4096" 到网卡配置文件(RHEL/CentOS),否则重启就回退。
Ring Buffer 调大 ≠ 丢包消失,还得看软中断和 CPU 分布
即使 rx_fifo_errors 归零,/proc/net/softnet_stat 第二列(dropped)还在涨,说明包进了 Ring Buffer,但内核 softirq 没来得及处理,被 softnet 队列丢弃了。
这时候得检查:
-
cat /proc/interrupts | grep eth0:看中断是否全挤在单个 CPU 上 -
cat /proc/net/softnet_stat | awk '{print $2}':持续监控 dropped 计数 - 启用 RPS:
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(f是 4 核掩码,按实际 CPU 数调整)
最容易被跳过的是:调大 Ring Buffer 后没同步调大 net.core.rmem_max 和应用层 SO_RCVBUF。网卡“装得下”,内核 socket “接不住”,照样丢包——这阶段的丢包会记在 UdpOverflows 里,不是 rx_fifo_errors。










