我正在修改现有应用程序中的一些基础设施,该应用程序将UDP数据包发送到1...N个地址(通常是多播)。当前有T个发送器对象,在某些情况下,所有的发送器都发送到相同的地址。
因此,为了简化并提供一个示例,假设有3个发送器对象,它们都需要发送到单个特定地址。我的问题是。哪个更有效率?:
选项1)在单个套接字周围放置一个互斥锁,并使所有发射器(T)共享同一套接字。
T----\
T----->Socket
T----/选项2)使用三个单独的套接字,所有套接字都发送到同一位置。
T----->Socket 1
T----->Socket 2
T----->Socket 3我怀疑对于第二种选择,在幕后,操作系统或NIC在最终传输周围放置一个互斥,因此从大的角度来看,选项2可能与选项1没有太大不同。
下周我可能会在我的开发PC上设置一个实验,但我无法测试用户可能安装在其上的所有潜在的计算机配置。我也意识到有不同的实现- Windows和Linux,不同的NIC芯片组制造商,等等,但我想知道是否有人可能有一些过去的经验或架构知识,可以阐明其中一个选项的优势。
谢谢!
发布于 2016-12-15 02:19:55
在Windows10计算机上运行了一些基准测试后,我有了一个“答案”,至少让我大致了解了应该期待什么。我不能百分之百确定每个系统都会以相同的方式运行,但我运行的大多数服务器都使用Intel NIC和Windows 10,并且我的典型数据包大小约为1200字节,因此答案至少让我感到放心,它对于我的特定场景是正确的。我决定将结果发布在这里,以防它可以帮助其他任何人使用这个实验。
我构建了一个简单的命令行应用程序,它首先生成T个发射器线程,所有线程都使用一个周围有互斥锁的套接字。之后,它将立即使用相同数量的发射器运行另一个测试,但这一次每个发射器都有自己的套接字,因此不需要互斥锁(尽管我确信在较低的级别上有锁定机制)。每个发射器以尽可能快的速度发送数据包。
这是我使用的测试设置:
下面是结果
正如预期的那样,只有一个线程的测试对两个线程的时间几乎相同。但是,在使用3个、6个和12个发射器的情况下,通过使用每个线程一个套接字而不是共享套接字,性能提高了大约3%。这不是一个巨大的差异,但如果你试图从你的系统中挤出最后一盎司,它可能是一个有用的统计数据。我的特殊应用程序是用于传输大量视频的。
就像是一次理智的检查...这是TaskManager在服务器端的网络页面的屏幕截图。您可以在测试中途看到吞吐量增加,这与切换到第二个多套接字测试时一致。我还包括了一段客户端计算机的录屏(这是一台Windows7机器)。

https://stackoverflow.com/questions/41071500
复制相似问题