Linux dropped 与内存的关系
结论与定位
在 Linux 网络统计中,dropped 表示数据包在网络接口层被系统主动丢弃,并不等同于物理链路错误。它最常见于接收路径,当内核/应用来不及消费数据、队列或缓冲区不足时触发;因此与内存/缓冲区资源存在间接关系,但也可能由配置、策略或链路问题引起。需要区分:
- RX dropped:已进入网卡/驱动队列,但在拷贝到内核或交给协议栈前被丢弃(常见于内核/应用处理不过来、队列满)。
- TX dropped:内核发送队列/驱动资源不足或策略限制导致未能发出(如队列满、带宽拥塞、策略丢弃)。
- 与之不同的 RX errors / RX overruns:前者是校验/帧错误,后者是网卡 Ring Buffer 溢出,属于更早阶段的硬件/驱动层丢包。
与内存或缓冲区相关的典型场景
- Socket 接收缓冲区不足(UDP 高发):应用读取慢或突发流量大时,内核 socket 缓冲区满会丢包。可通过增大 net.core.rmem_default / rmem_max 缓解,例如 sysctl -w net.core.rmem_max=26214400(约 25MB)。
- 内核网络 backlog 队列溢出:内核从网卡收包后、进入协议栈前的队列(netdev_max_backlog)不足会丢包,默认 1000,高带宽/突发场景可调大到 2000 或更高。
- 网卡 Ring Buffer 不足:网卡 DMA 环形缓冲(Ring Buffer)太小或消费不及时会溢出,表现为 RX overruns 增长;可用 ethtool -g 查看/调整。
- 系统内存/负载压力:当 CPU、memory、IO 负载过高,内核/应用处理网络数据的速度下降,间接导致各类队列与缓冲区来不及消费而出现 dropped。
如何快速判断是否与内存或缓冲区相关
- 查看接口层统计:ip -s link show eth0,关注 RX/TX dropped 是否持续增长;对比 RX errors / RX overruns 判断是否为硬件/驱动层问题。
- 检查内核/协议栈队列与缓冲:
- 查看 netdev_max_backlog 与 /proc/net/softnet_stat(第二列为 backlog 溢出丢弃计数),判断是否因内核队列满导致。
- 查看/调整 socket 缓冲:sysctl net.core.rmem_default / rmem_max;必要时按业务调大。
- 查看/调整网卡 Ring Buffer:ethtool -g eth0(当前/最大 Rx/Tx 描述符数)。
- 关联系统资源:用 top/vmstat/中断与软中断统计观察 CPU、内存、IO 是否成为瓶颈(软中断占用高常伴随网络丢包)。
处理建议(面向“与内存/缓冲相关”的 dropped)
- 适度增大内核与驱动缓冲:
- 提高 socket 接收缓冲:sysctl -w net.core.rmem_default=2097152;net.core.rmem_max=2097152(按带宽与业务调优)。
- 提高内核 backlog:sysctl -w net.core.netdev_max_backlog=2000+。
- 提高网卡 Ring Buffer:ethtool -G eth0 rx 4096(视网卡上限而定)。
- 降低单核软中断压力与提升消费能力:中断/软中断亲和与多队列优化、加快应用消费线程、必要时扩容实例规格。
- 若 dropped 数值很小且长时间不再增长,通常属于瞬时波动,可先观察再决定是否调整。