簡體   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