我的应用程序使用libpcap从各种来源捕获UDP数据包。有时应用程序必须做一些繁重的计算工作(球场~2秒)...在此期间应用程序不是从libpcap“读取”。这导致数据包丢失,但我很难理解为什么。内核没有丢弃数据包&我认为套接字缓冲区应该足够大。
接口每秒接收~1000个数据包。最大数据包大小约为600字节。所以我们称它为1MB / s(高估)。
我将libpcap缓冲区大小设置为4MiB(以字节为单位传递给libpcap),快照长度为~600字节。
我还修改了一些操作系统参数(Centos7):
/proc/sys/net/core/netdev_max_backlog: 10000
/proc/sys/net/core/optmem_max: 8388608
/proc/sys/net/core/rmem_default: 8388608
/proc/sys/net/core/rmem_max: 8388608
来自netstat -i的结果:
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR
eno2 1500 558672786 0 0 0
我已经尝试使所有这些值更大,但丢弃的数据包数量似乎没有减少。
可能值得一提的东西......我也有tcpdump在捕获相同UDP数据包的同一个盒子上运行(数据包是多播的)。当数据包从某些缓冲区(或堆栈的某些部分)中删除时,它会从问题中提出。
我迷失在这里。任何帮助将不胜感激。
感谢。