UDP套接字池是否会提高数据报交付成功率并提高效率?

时间:2014-04-16 08:11:26

标签: c sockets unix udp solaris

我正在使用C在Solaris中开发UDP客户端模块,并且有2个设计模块:

(1)创建套接字,并通过此套接字发送所有消息。接收线程仅在此套接字上调用recvfrom

(2)创建一组套接字。发送消息时,从套接字池中随机选择一个套接字。接收线程需要在一组套接字上调用pollselect

当吞吐量很低时,我认为第一个设计模块没问题。

如果吞吐量很高,我想知道第二个设计模块是否会更好? 因为它会将消息发送到一组套接字,这可能会提高UDP数据报传输的成功率和效率。

2 个答案:

答案 0 :(得分:1)

仍然只有一个网络。你可以拥有尽可能多的套接字,线程,等等。速率确定步骤是网络。没有必要这样做。

答案 1 :(得分:0)

这里的问题主要取决于计算机的并行程度(核心数)以及算法的并行程度。最有可能的是,你的CPU核心比网络连接快得多,甚至其中一个也很容易淹没连接。因此,在典型的系统选项(1)上,可以提供更好的性能和更低的丢弃率。

这是因为在多个线程或进程上使用UDP端口会产生很大的开销,因为操作系统必须执行内部锁定以确保数据包的内容不会被多路复用和损坏,这会导致严重的性能损失,显着增加了数据包丢失的可能性,其中内核放弃等待其他线程并且只是抛弃你的待处理数据包。

在极端情况下,你的核心非常慢并且你的连接速度非常快(例如一个500核心的超级计算机,具有10 - 100Gbit光纤连接)选项二可能变得更加可行,因此连接将不太可能锁定足够快以保持许多内核忙碌而不会相互绊倒并经常锁定,这将不会增加可靠性(并且可能会略微降低),但可能会根据您的架构提高吞吐量。

总的来说几乎在每种情况下我都建议选项1,但是如果你真的有一个极端的吞吐量情况你应该考虑其他方法,但是如果你正在为这种系统编写软件,你可能会从一些更通用的方面受益在大规模并行系统中进行训练。

我希望这会有所帮助,如果您有任何疑问,请发表评论。