Linux dropped与内存使用有关
小樊
55
2026-01-11 07:19:25
Linux dropped与内存的关系
概念澄清
- 在 Linux 网络统计中,dropped 表示数据包在网络接口层被系统主动丢弃,不等同于物理链路错误。常见为 RX dropped(已进入网卡/驱动队列,但在拷贝到内核或交给协议栈前被丢弃)与 TX dropped(内核发送队列/驱动资源不足或策略限制未能发出)。与之不同的 RX errors / RX overruns 分别是校验/帧错误与网卡 Ring Buffer 溢出,属于更早阶段的硬件/驱动层问题。dropped 与内存/缓冲区存在间接关系:当内核/应用来不及消费、队列或缓冲区不足时会触发,但也可能由配置、策略或链路问题引起。
与内存或缓冲区相关的典型场景
- 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 是否成为瓶颈(软中断占用高常伴随网络丢包)。
处理建议面向内存与缓冲相关
- 适度增大内核与驱动缓冲:提高 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 数值很小且长时间不再增长,通常属于瞬时波动,可先观察再决定是否调整。
不要与 drop_caches 混淆
- /proc/sys/vm/drop_caches 用于调试/测试时主动丢弃干净页缓存与可回收 slab(如 dentries/inodes),写入 1/2/3 分别对应释放页缓存、可回收 slab、两者皆释放;该操作不会释放脏对象,且可能导致性能下降,不建议在生产环境使用。它与网络接口的 dropped 计数无关。