linux - UDP 数据包被 linux 内核丢弃

标签 linux udp multicast packet-loss

我有一个通过多播发送 UDP 数据包的服务器和一些正在列出这些多播数据包的客户端。 每个数据包的大小固定为1040 Bytes,服务器发送的整个数据大小为3GByte。

我的环境如下:

1 Gbit 以太网

40 个节点,1 个发送方节点和 39 个接收方节点。 所有节点都具有相同的硬件配置:2 个 AMD CPU,每个 CPU 有 2 个 Cores @2,6GHz

在客户端,一个线程读取套接字并将数据放入队列中。一个额外的线程从队列中弹出数据并进行一些轻量级处理。

在多播传输过程中,我发现节点端的丢包率为 30%。通过观察 netstat –su 统计数据,我可以说客户端应用程序丢失的数据包等于 netstat 输出中的 RcvbufErrors 值。

这意味着所有丢失的数据包都被操作系统丢弃,因为套接字缓冲区已满,但我不明白为什么捕获线程无法及时读取缓冲区。 在传输过程中,4 个核心中的 2 个被使用了 75%,其余的正在休眠。 我是唯一一个使用这些节点的人,我认为这种机器处理 1Gbit 带宽没有问题。我已经做了一些优化,通过为 amd cpus 添加 g++ 编译器标志,这将丢包率降低到 10%,但我认为它仍然太高。

我当然知道UDP不靠谱,我有自己的纠错协议(protocol)。

我没有任何管理权限,所以我无法更改系统参数。

有什么提示可以提高性能吗?

编辑: 我通过使用 2 个正在读取套接字的线程解决了这个问题。 recv 套接字缓冲区有时仍会变满。但平均降幅在1%以下,处理起来不是问题。

最佳答案

在 Linux 上追踪网络丢包可能有点困难,因为有许多组件都可能发生丢包。它们可以发生在硬件级别、网络设备子系统或协议(protocol)层。

我写了一个很detailed blog post解释如何监控和调整每个组件。在这里总结为一个简洁的答案有点困难,因为有太多不同的组件需要监控和调整。

关于linux - UDP 数据包被 linux 内核丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899937/

相关文章:

Linux 内核 : what are instruction cache and mp-IRQ subsystem within a terms of function interception via replace?

c# - udp 数据包未通过

java.io.IOException : Attempted to join a non-multicast group 异常

java - 具有并行处理功能的 Apache Camel 多播不会将异常传播到死信处理程序

linux - 让 Linux 下的 R 访问 DLL

linux - cygnus 服务未作为服务启动

linux - 如何在 linux 中更改 net-snmp 陷阱发送端口?

c - 如何从接收方向发送方发送NACK消息

java - 快速接收UDP数据包

java - Camel 组播不工作