服务公告

服务公告 > 网络与线路 > 服务器网卡的环形缓冲与丢包

服务器网卡的环形缓冲与丢包

发布时间:2026-07-27 12:19
服务器不明原因的网络丢包,排查到最后常常落在网卡收包缓冲区上。这块叫环形缓冲的内存,是网卡与内核协议栈之间的中转站:包先进入缓冲区排队,内核再逐个取走处理。队列一旦来不及消化就溢出,丢包随之发生。理解这个机制,才能识别这类丢包的指纹并正确处置。 ## 溢出的原理 收包的完整链路是网卡收到包,写入环形缓冲,内核发起软中断把包送入协议栈,交给应用处理。环形缓冲的容量是固定的,消化速度取决于内核收包路径的效率:中断分配、软中断执行、内存分配都会影响。当瞬时包速率超过消化速率,队列逐渐填满,新到的包无处可放被直接丢弃,这就是溢出丢包。它有几个特征:发生在机器内部而非网络路径上,链路质量完全正常时也会出现;与负载相关,流量尖峰与软中断争抢 CPU 时集中出现;丢包位置在收方向,发送方向通常无恙。 ## 丢包指纹的识别 识别从计数器入手,查看网卡的收方向丢包统计与环形缓冲用量: ```bash ethtool -S eth0 | grep -iE 'drop|miss|fifo' ethtool -g eth0 ``` 第一条的输出里,环形缓冲溢出的典型指纹是接收丢包计数持续增长而链路层错误为零,同时系统侧软中断占用偏高。第二条显示当前与最大可设的收发队列深度。计数增长与流量高峰吻合、链路错误为零、软中断繁忙三个信号齐备,溢出诊断基本成立。 ## 处置的取舍 处置手段按成本排序:第一层是调大环形缓冲,把队列加深,吸收更大的瞬时尖峰,用 ethtool -G 把收方向队列设到期望值后生效,代价是内存占用略增与排队延迟略升,对多数业务可以接受。第二层是提升消化能力:开启多队列并把队列中断分布到多个核,让收包处理并行化;调高软中断的处理预算。第三层是减少不必要的包:用防火墙规则在更早的位置丢弃无用流量,开启网卡硬件过滤分流。多数场景调缓冲加多队列分布就能解决。顺云用户可先在控制台监控里确认丢包与流量曲线的对应关系,再上机按指纹确认。 ## 常见的误区 一是见丢包就怪网络线路,环形缓冲丢包在机器内部,换线路毫无帮助,先看计数器再下结论。二是把缓冲调到最大就收工,缓冲只是吸收尖峰,消化能力跟不上时队满只是推迟,CPU 收包路径的优化才是根治。三是重启后设置丢失,环形缓冲的设置重启不保留,要写入启动脚本或网络配置持久化。四是忽视发送方向,发送队列同样存在溢出场景,症状类似但指纹在发送计数器上,排查时收发两向都看。