资讯动态

139、流控机制缺失时大数据量传输的丢包

发布时间:2026/10/23 8:55:22 来源:尧图企业网站定制
一个让我连续加班四天的丢包现场几年前我接手过一个工业数据采集系统的优化项目。现场有若干采集节点,每个节点每隔几十毫秒就往中心汇聚端发送一帧采集数据,单帧长度在几KB到几十KB之间浮动。汇聚端跑在一个处理能力中等的嵌入式板上,网络链路是百兆以太网。项目前期小批量验证时一切正常,数据完整,延迟可接受。等到现场把采集节点从4个扩展到20个,问题来了:汇聚端应用层统计的接收帧数,比采集端统计的发送帧数少了大约3%到8%,而且丢包分布极不均匀——有时候连续几分钟一帧不丢,有时候一秒钟丢掉几十帧。更让人头疼的是,丢的帧没有任何规律,重传能补回一部分,但重传本身又加剧了链路拥塞,形成恶性循环。我最初怀疑的方向全是错的。我先查应用层接收缓冲区是不是太小,调大之后丢包率几乎没变化。又怀疑是链路误码,换了线缆、查了交换机端口计数器,物理层没有异常。接着怀疑接收端CPU处理不过来,加了统计发现CPU占用率长期在40%以下,并不是瓶颈。折腾了两天,最后用抓包工具在接收端网卡侧抓包,才定位到真正的问题:大量数据帧在网卡驱动层就被丢弃了,根本没有送到应用层。原因说穿了很简单:发送端和接收端之间,没有任何流控机制。发送端只管按自己的节奏发,接收端驱动层的接收环形缓冲区满了之后,新到的帧直接被硬件或驱动丢弃,既不通知发送端,也不通知应用层。应用层看到的“丢包”,其实是在驱动层就已经发生的静默丢弃。这个坑让我意识到一件事:流控缺失导致的丢包,最隐蔽的地方不在于“丢”,而在于“丢得悄无声息”。物理层误码会体现在计数器上,应用层处理不过来会体现在CPU和队列深度上,但驱动层环形缓冲区溢出,如果没人主动去查那个计数器

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑