recv跳过UDP数据包

问题描述

我写了一个简单的程序来处理传入的UDP数据包。我发送了60000个UDP数据包,该程序丢失了数据包。带宽约为60-70 Mbit / s。 如果我并行运行tcpdump,那么我会看到所有软件包都被内核接收。我也尝试了recvmsg和recvmmsg,结果相同。

程序源代码

<owl:ObjectProperty rdf:ID="isbrother">
    <rdfs:subPropertyOf rdf:resource="#isSibling" />
    <rdfs:range rdf:resource="#Human">
    <rdfs:domain rdf:resource="#Male">
</owl:ObjectProperty>

解决方法

问题已解决。我对tcpdump错误,不是所有数据包都传递到内核。我也没有详细描述问题。该程序在单核ARM处理器上运行,UDP数据包的有效载荷为256字节,因此CPU跟上了数据流,并导致内核UDP队列流量增加,我发现数据包丢失。 iperf3具有1448字节的有效负载,并且工作正常。如果我将iperf3有效负载软件包降低为256个字节,它也会开始丢弃数据包。 为了解决该问题,我将有效负载增加到512字节,增加了net.core.rmem_max,net.core.rmem_default和NIC环形缓冲区,并且一切正常。