先检查网卡硬件与驱动丢包:用ethtool查Link、Speed、Duplex及rx_errors/rx_dropped/rx_over_errors;rx_dropped涨多因NAPI慢或中断风暴,rx_over_errors升则Ring Buffer溢出;再查/proc/net/dev和ethtool -S确认;虚拟网卡rx_missed_errors升说明vCPU过载;接着排查tc/qdisc是否人为丢包,用tc qdisc show和tc -s qdisc show验证,误配需tc qdisc del;tcpdump应在eth0、lo、any三处抓包定位链路段,注意offload影响;最后排查conntrack表满(conntrack -S看insert_failed)和UDP接收缓冲区溢出(rmem_max与recv频率不匹配)。

先看网卡硬件和驱动有没有在 silently 丢包
很多丢包根本没进协议栈,压根不会被 tcpdump 捕获——比如光模块故障、协商速率不匹配、Ring Buffer 溢出。别急着抓包,先跑:ethtool eth0,重点盯三项:Link detected: yes(物理连通)、Speed: 和 Duplex:(是否全双工+速率一致)、rx_errors / rx_dropped / rx_over_errors。其中 rx_dropped 持续涨,大概率是 NAPI 调度慢或中断风暴;rx_over_errors 上升,则基本坐实 Ring Buffer 溢出。
补充验证命令:cat /proc/net/dev 看 Rx-DRP 和 Rx-OVR 列;ethtool -S eth0 | grep -i "drop\|over\|buffer" 查更细的驱动级计数器(如 rx_no_buffer_count)。注意:虚拟网卡(如 virtio)的 rx_missed_errors 上升,往往意味着 vCPU 处理不过来,不是网线问题。
检查 tc/qdisc 是否在主动模拟丢包
这是最常被忽略的“伪丢包”来源——你看到丢包,其实是人为配置的。运行:tc qdisc show dev eth0。如果输出里带 netem 或 loss 5% 这类字样,立刻确认:这不是故障,是测试/限流策略。比如常见错误配置:tc qdisc add dev eth0 root netem loss 10%,它会让所有出向包无差别丢 10%,且 /proc/net/dev 统计里完全不体现。
排查要点:
-
tc -s qdisc show dev eth0带-s才能看到真实丢包计数(如dropped 42) - 若确认是误配,删掉用:
tc qdisc del dev eth0 root - 注意:容器网络(如 CNI 插件)也可能在 host interface 上挂
tc规则,别只查容器内网卡
用 tcpdump 定位丢包发生位置
抓包不是万能,但位置错了就全白忙。关键原则:在哪抓,决定了你能排除哪段链路。
三处必试位置:
华友协同办公管理系统(华友OA),基于微软最新的.net 2.0平台和SQL Server数据库,集成强大的Ajax技术,采用多层分布式架构,实现统一办公平台,功能强大、价格便宜,是适用于企事业单位的通用型网络协同办公系统。 系统秉承协同办公的思想,集成即时通讯、日记管理、通知管理、邮件管理、新闻、考勤管理、短信管理、个人文件柜、日程安排、工作计划、工作日清、通讯录、公文流转、论坛、在线调查、
-
tcpdump -i eth0 -n -t -S port 8080:网卡入口。若这里就没收到 SYN,问题在物理链路或上游设备 -
tcpdump -i lo -n -t -S port 8080:本地回环。若这里能抓到请求但服务没响应,说明应用层或 socket 接收队列已满 -
tcpdump -i any -n -t -S 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0':快速过滤握手包,看 SYN 有无 ACK 回复、是否出现重复 ACK 或 RST
特别注意:tcpdump 默认看不到 offload 后的分段(如 GSO/TSO),可能误判为“大包丢弃”。加 -K 参数禁用 checksum offload 可缓解。
别漏掉 conntrack 和 socket 缓冲区溢出
这两类丢包无声无息,不触发 ICMP,客户端只感知为超时或重连失败。
conntrack 表满会导致新建连接静默丢弃:
- 查状态:
conntrack -S,紧盯insert_failed是否持续增长 - 临时缓解:
echo 65536 > /proc/sys/net/netfilter/nf_conntrack_max - 根本解法:优化连接生命周期,或改用 NOTRACK 规则绕过 conntrack(仅限可信内网)
UDP 丢包高频原因是接收缓冲区溢出:
- 查当前值:
cat /proc/sys/net/core/rmem_max和应用实际setsockopt(SO_RCVBUF) - UDP 应用必须异步读取,否则缓冲区积压后新包直接被内核
drop(netstat -su里的packet receive errors会涨) - 不要只调大
rmem_max,还要确保应用调用recv()频率 ≥ 数据到达速率
真正难缠的丢包,往往藏在「看起来一切正常」的地方:tc 规则开着没人记得、conntrack 表悄悄满了、应用用阻塞式 UDP recv 坐等超时……工具只是镜子,照见的是配置和设计里的盲点。









