结论与含义
在 Linux 中,接口统计里的 dropped 表示数据包在到达网卡并被内核接收路径接管的早期阶段被丢弃,并不等同于端到端链路上的“网络丢包”。常见成因包括:网卡 Ring Buffer 不足、内核处理不及时(软中断/CPU 瓶颈)、驱动或配置问题等。因此,看到 dropped 增多通常意味着本机的接收处理链路存在瓶颈或异常,需要结合其他指标与工具进一步定位。
如何快速判断是否属于网络问题
- 对比端到端与主机侧指标:用 ping / traceroute 检查路径丢包与时延;同时查看本机接口统计(如 ifconfig 或 cat /proc/net/dev)中的 RX/TX dropped、errors、fifo。若端到端正常而本机 dropped 增长,多为本机处理瓶颈;若端到端也丢包,则可能是链路/对端问题。
- 区分不同丢包来源:
- RX dropped 增长但 RX overruns/fifo 为 0,常见于内核/队列处理不及或内存紧张;
- RX overruns/fifo 增长,多见于 Ring Buffer 不足或中断/CPU 处理不过来;
- 协议栈与应用层丢包可用 netstat -s -u 观察(如 receive buffer errors)。
- 检查网卡协商与链路:ethtool 看 Speed/Duplex/Auto-neg 是否一致;必要时重协商或固定速率。
- 检查安全策略与路由:iptables -L -n -v、ip a / route -n 排查策略/配置异常。
以上步骤能快速判断 dropped 更偏向“本机处理瓶颈”还是“外部网络链路”。
常见成因与对应处理
- Ring Buffer 不足:用 ethtool -g 查看,必要时 ethtool -G rx 4096(或更高)增大接收环;同时关注 ethtool -S 中的 rx_fifo_errors。
- 软中断/CPU 瓶颈:单核 softirq 占用高(如 mpstat -P ALL 1),可优化中断亲和/队列(RSS)、适当提升 netdev_budget,或扩容多核。
- 内核 backlog 队列溢出:调大 net.core.netdev_max_backlog(如 2000)。
- 协商/物理层异常:速率双工不一致、线缆/端口问题,使用 ethtool -r 重协商或固定速率,必要时更换介质。
- 协议栈/应用层缓冲不足:UDP 场景关注 netstat -s -u 的 receive buffer errors,适当增大 socket 接收缓冲。
- 安全策略/路由配置:核对 iptables、安全组、路由表 是否误拦截或错配。
上述措施覆盖了从网卡硬件到内核协议栈的主要丢包点,可逐项验证并优化。
常用命令清单
- 查看接口与丢包:ifconfig ;cat /proc/net/dev
- 驱动/硬件与协商:ethtool ;ethtool -i ;ethtool -S | grep -i rx_;ethtool -g/-G
- 协议栈与应用层统计:netstat -s -u;ss -lunp
- 连通性与路径:ping;traceroute
- CPU/软中断:mpstat -P ALL 1;top
- 策略与路由:iptables -L -n -v;ip a;route -n;dmesg | grep -i
这些命令覆盖了 dropped 定位所需的关键观测面,从链路到驱动再到协议栈与应用。