【发布时间】:2011-10-01 10:41:28
【问题描述】:
在 Redhat Linux 上,我有一个多播侦听器来侦听一个非常繁忙的多播数据源。它自己运行完美,没有丢包。然而,一旦我使用完全相同的设置(相同的 src/dst IP 地址、sock 缓冲区大小、用户缓冲区大小等)启动同一应用程序的第二个实例,我开始看到两个实例的数据包丢失非常频繁。他们丢失了完全相同的数据包。如果我停止其中一个实例,剩下的一个会恢复正常而不会丢失任何数据包。
最初,我虽然是 CPU/内核负载问题,但可能无法足够快地将数据包从缓冲区中取出。于是我又做了一个测试。我仍然保持应用程序的一个实例运行。但随后在同一台计算机上启动了一个完全不同的多播侦听器,但使用第二个 NIC 卡并侦听不同但更繁忙的多播源。两个应用程序运行良好,没有任何数据包丢失。
所以看起来一张 NIC 卡的功能不足以支持两个多播应用程序,即使它们收听完全相同的内容。丢包问题的可能原因可能是,在这种情况下,NIC 卡驱动程序需要将传入的数据复制到两个 sock 缓冲区,而这个额外的复制任务对于以太网卡来说太多了,因此它会丢弃数据包。对这个问题有更深入的分析和任何可能的解决方案吗?
谢谢
【问题讨论】:
-
真的很奇怪。 NIC 卡不会立即从 NIC 设备驱动程序复制到套接字。当 NIC 接收到多播帧时,多播服务例程将过滤并将数据包转发到协议栈例程。协议栈例程负责将 UDP 数据包复制到每个套接字缓冲区。如果让两个实例加入相同的多播地址但在不同的接口上会发生什么?
-
我不能做这个测试,因为只有这个 NIC 端口连接到数据源。但是我所做的测试(在问题中提到)表明它应该可以工作。但我真的很想让它在同一张网卡上工作。