Linux服务器网卡丢包怎么办?RX/TX dropped、错误计数与网络瓶颈排查教程
本内容发表于:2026-09-07 11:06:42
浏览量
1046

Linux服务器网卡RX和TX丢包排查示意图

Linux 服务器出现 RX dropped 或 TX dropped 时,先不要急着认定是网线、交换机或运营商线路故障。接口丢包计数可能产生在网卡硬件、驱动、接收环形队列、内核网络 backlog、流量控制队列、虚拟网卡乃至云平台宿主机等不同位置。正确的处理方式,是先确定计数在哪一层增长,再结合业务异常、CPU 软中断和驱动统计缩小范围。

一、先确认是否真的存在业务丢包

接口计数增加,并不一定意味着用户请求已经失败。先记录故障时间、目标地址、协议和受影响方向,再同时检查延迟、重传、超时和应用错误。建议在问题发生时保留一组基线:

date
ip -s link
ss -s
nstat -az
sar -n DEV 1
ping -c 20 目标地址
mtr -rwzc 50 目标地址

ping 和 mtr 只能提供路径层面的线索。中间设备可能限制 ICMP,因此某一跳显示丢包、但后续节点正常,并不能直接证明该跳正在丢弃业务流量。若应用使用 TCP,还要结合 TCP 重传、请求超时和服务端日志判断。

二、用 ip 查看接口总计数

ip -s link
ip -s -s link show dev eth0

重点观察 RX 和 TX 两个方向的 errors、dropped、overrun 等字段是否持续增长。建议间隔 30 秒或 1 分钟采样两次,而不是只看开机以来的累计值。

  • RX errors:通常表示接收阶段发现了错误,但具体含义仍取决于驱动和硬件。

  • RX dropped:数据包在接收路径某个阶段未被继续处理,可能与缓冲区、backlog、协议处理或虚拟网络有关。

  • TX errors:发送过程中出现错误。

  • TX dropped:数据包在发出前被队列、流量控制或设备层丢弃。

不同驱动对统计字段的映射并不完全相同,所以接口总计数只能作为入口,不能单独用于判断根因。

三、用 ethtool 定位网卡和驱动层问题

ethtool eth0
ethtool -S eth0
ethtool -g eth0
ethtool -k eth0

ethtool eth0 可查看链路速率、双工模式和 Link detected 状态;ethtool -S 会显示驱动或设备提供的扩展计数。常见字段可能包含 CRC、frame、missed、no buffer、timeout、reset、queue drop 等,但字段名由驱动决定,不应脱离网卡型号和驱动文档机械解读。

如果 CRC 或 frame 类错误持续增长,优先检查物理链路、模块、线缆、交换机端口、速率与双工协商。如果 missed、no buffer 或某个 RX queue 的丢弃计数增长,则更应关注接收队列、CPU 处理能力和中断分配。

四、检查 CPU、softirq 和 IRQ 是否处理不过来

高包速率场景中,总带宽未跑满也可能丢包。大量小包会提高每秒包数,使单个 CPU、软中断或某个接收队列先达到瓶颈。

mpstat -P ALL 1
cat /proc/interrupts
cat /proc/net/softnet_stat
sar -n DEV 1

检查网卡 IRQ 是否长期集中在少数 CPU,以及这些 CPU 的软中断占用是否明显偏高。/proc/net/softnet_stat 可帮助发现内核网络处理队列中的丢弃或时间片耗尽,但字段布局可能随内核版本变化,解析时应参考当前内核文档、源码或发行版说明。

若多队列网卡的流量分布不均,可继续检查 RSS、RPS、RFS、XPS、irqbalance 和 CPU 亲和性。调整前先记录队列计数和 CPU 基线;错误的亲和性设置可能把压力进一步集中到单核。

五、检查 ring buffer 与内核 backlog

接收速度短时间超过内核处理速度时,RX ring 或内核 backlog 可能溢出。先查看网卡支持值和当前值:

ethtool -g eth0
sysctl net.core.netdev_max_backlog
sysctl net.core.netdev_budget
sysctl net.core.netdev_budget_usecs

不要看到丢包就直接把所有缓冲参数调到最大。更大的队列可能吸收短时突发,但也可能增加排队延迟和内存占用,并掩盖 CPU、驱动或应用处理不足的问题。合理做法是一次只调整一个变量,在业务低峰灰度修改,同时观察丢包、延迟、CPU、内存和队列长度。

六、排查 TX 队列和流量控制

如果主要是 TX dropped,应查看 qdisc、发送队列和出口整形规则:

tc -s qdisc show dev eth0
ip -s link show dev eth0
ip link show dev eth0

tc -s qdisc 中的 dropped、overlimits 和 backlog 可以说明数据包是否在流量控制层排队或被丢弃。限速策略、队列长度、突发流量以及下游链路拥塞,都可能导致发送方向计数增加。修改 qdisc 前,应先导出现有配置并准备回滚命令。

七、检查 MTU 与 offload

ip link show dev eth0
ethtool -k eth0
ping -M do -s 1472 目标地址

主机、虚拟网卡、隧道、负载均衡器和上游网络的 MTU 不一致,可能引起分片、丢弃或“部分请求正常、大包请求失败”。带 VXLAN、GRE、VPN 等封装时,需要给额外头部预留空间。

GRO、GSO、TSO、LRO 和 checksum offload 会改变抓包时看到的数据包形态。不要仅因 tcpdump 中出现看似异常的校验和就认定线路错误,也不要在生产环境一次性关闭全部 offload。若需要验证,应逐项临时测试并观察 CPU 与吞吐变化。

八、虚拟机、容器和云服务器要逐层检查

在虚拟化环境中,丢包可能出现在 guest 网卡、veth、bridge、tap、宿主机物理网卡或云平台虚拟交换层。容器场景可分别检查:

ip -s link
ip -d link
tc -s qdisc show
nsenter -t <PID> -n ip -s link

如果虚拟机内部计数正常,但应用仍出现重传或超时,需要结合宿主机和云平台监控。普通云主机通常看不到底层物理 NIC 的完整驱动统计,此时应保留时间点、实例、可用区、五元组和抓包证据,交给云服务商进一步核查。

九、推荐的排查顺序

  1. 确认异常时间、接口、流量方向和受影响业务。

  2. 连续采样 ip -s link,确认哪些计数正在增长。

  3. 使用 ethtool -S 区分物理、驱动和队列线索。

  4. 检查 CPU、softirq、IRQ 分布及每秒包数。

  5. 分别检查 RX ring、softnet backlog 和 TX qdisc。

  6. 核对 MTU、隧道封装与 offload 设置。

  7. 在虚拟化环境中逐层检查 guest、veth、bridge、host 和云平台。

  8. 一次只做一项可回滚调整,再用相同负载复测。

十、修复后如何验证

修复是否有效,不能只看某个累计计数仍然大于零。应记录变更前的时间窗口,再比较变更后单位时间的增量:

ip -s -s link show dev eth0
ethtool -S eth0
sar -n DEV 1
ss -s
nstat -az

同时验证业务请求成功率、P95/P99 延迟、TCP 重传、CPU softirq、队列 backlog 和吞吐。若丢包减少但延迟明显升高,可能只是把“丢弃”变成了更长时间的排队,仍需继续优化。

常见问题

RX dropped 增长一定是网卡坏了吗?

不一定。它也可能来自驱动队列、内核 backlog、虚拟接口或协议处理。应结合 ethtool -S、softnet、CPU 和链路错误计数判断。

带宽没有跑满,为什么仍会丢包?

瓶颈可能是每秒包数而不是每秒比特数。大量小包、单队列热点、单核软中断或突发流量,都可能在总带宽达到上限前造成丢包。

可以直接增大 netdev_max_backlog 吗?

可以作为经过验证的调优选项,但不应作为默认答案。先确认 softnet 队列确实溢出,并评估延迟、内存和 CPU;修改后要监控并保留回滚值。

为什么 tcpdump 显示 checksum incorrect?

发送方向的校验和可能由网卡 offload 在数据包离开主机前计算,因此主机内抓包看到的值不一定代表线上数据包错误。可结合对端抓包、驱动统计和 offload 状态验证。

结论

Linux 网卡丢包排查的关键,不是看到 dropped 就立即修改内核参数,而是先确定丢包发生在物理链路、驱动队列、softnet、流量控制还是虚拟网络层。用 ip 建立总览,以 ethtool、CPU/IRQ、softnet_stat 和 tc 逐层定位,再进行单变量、可回滚的调整,才能避免把真实瓶颈转移到其他位置。

参考资料

  1. Linux man-pages:ip-link(8),核查日期:2026-09-07

  2. Linux man-pages:ethtool(8),核查日期:2026-09-07

  3. Linux Kernel Documentation:Interface statistics,核查日期:2026-09-07

  4. Linux Kernel Documentation:Scaling in the Linux Networking Stack,核查日期:2026-09-07