繁体   English   中英

UDP套接字池会提高数据报传送成功率并提高效率吗?

[英]Will UDP socket pool improve datagram delivery successful rate and be more efficient?

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

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

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

当吞吐量低时,我认为第一个设计模块就可以了。

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

仍然只有一个网络。 您可以根据需要拥有任意数量的套接字,线程。 速率确定步骤是网络。 这是没有意义的。

这里的问题主要取决于计算机的并行度(内核数)以及算法的并行度。 无论如何,您的CPU内核极有可能比网络连接快得多,甚至其中之一也很容易使连接不堪重负。 因此,在典型的系统选项中,选项(1)将提供明显更好的性能和更低的丢包率。

这是因为由于操作系统必须进行内部锁定以确保数据包的内容不被多路复用和损坏,因此在多个线程或进程上使用UDP端口会产生大量开销,这会导致严重的性能损失并大大增加机会丢包的原因是内核放弃等待其他线程而只是将您的未决数据包丢弃。

在极端情况下,您的核心速度非常慢,并且连接速度非常快(例如具有10-100Gbit光纤连接的500核心超级计算机),选项2变得更可行,因为连接速度足够快,锁定的可能性较小为了使许多内核保持忙碌而又不会彼此跳闸并经常锁定,这不会(但可能会略有降低)可靠性,但可能会提高吞吐量,具体取决于您的体系结构。

总的来说,在几乎每种情况下,我都会建议选项1,但是如果确实确实存在吞吐量过大的情况,则应该考虑其他方法,但是,如果您正在为这种系统编写软件,则可能会从大量的常规培训中受益并行系统。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM