2011-03-28 45 views
4

我們有一組服務器應用程序,它們從設備/工具接收測量數據。信息傳遞時間是目前我們的主要瓶頸,所以我們有興趣減少它以改進過程。工具和服務器應用程序之間的通信是通過在Redhat Linux上使用C++編寫的TCP/IP套接字來實現的。減少高容量Intranet應用程序通信中的網絡延遲

是否可以通過更改TCP/IP配置設置或調整tcp內核函數來減少使用硬件的消息傳輸時間? (因爲通信是在一個安全的內聯網上,我們可以犧牲安全性來提高速度)

回答

0

如果可以的話,減少延遲的明顯步驟是從TCP切換到UDP。

+0

實際上可以使性能更糟,因爲TCP經常加速比UDP多。與是否需要可靠性密切相關。 – 2011-03-28 03:57:01

+0

我們可以減少2-3%的數據,因爲它是一個測量數據。 RTP(實時協議)是否也可以使用? – paseena 2011-03-28 05:34:11

+0

@ Steve-o:有關此加速度的任何信息?我無法想象這將如何完成,因爲TCP主要是(忽略次要的東西)對UDP的重量級包裝。 @fruit_trader:關於單獨回答中的RTP – 2011-03-28 20:12:22

-1

是的。

谷歌「TCP幀大小」的細節。

+2

好的答案包括「用這句話去谷歌」。 – Olli 2011-03-28 10:24:20

5

根據工作負載的不同,在套接字連接上禁用Nagle's Algorithm可以提供很多幫助。

當處理大量的小消息時,我發現這產生了巨大的差異。

從內存中,我相信C++套接字選項被稱爲TCP_NODELAY

+1

Nagle的算法是TCP的重要組成部分,默認情況下通過語言禁用它是完全令人憤慨的。你不記得哪種語言這樣做?但在這種特殊情況下,TCP_NODELAY將完成這項工作,所以+1 – 2011-03-28 23:26:59

+0

@Andy我認爲這是PHP,但我剛回來審查一年前我正在使用的原型代碼,發現該選項正在被我正在使用的第三方課程關閉 - 當時沒有選擇,因爲那時我開始調查爲什麼我的C++套接字比PHP的要慢:) – 2011-03-29 00:09:26

1

在硬件方面嘗試Intel Server NICs並確保TCP offload Engine(TOE)被啓用。

還有一個重要的決定是在等待時間和goodput之間做出的,如果你希望以犧牲正常運行爲代價獲得更好的延遲,可以考慮減少中斷合併週期。有關詳細信息,請參閱英特爾文檔,因爲它們提供了許多可配置的參數。

2

正如@Jerry Coffin提出的,你可以切換到UDP。 UDP是不可靠的協議,這意味着你可能會丟失你的數據包,或者他們可能以錯誤的順序到達,或被複制。所以你需要在應用程序級別處理這些情況。由於您可能會丟失一些數據(如您在評論中所述),無需重傳(任何可靠協議中最複雜的部分)。你只需要丟棄過時的數據包。使用簡單的序列編號,你就完成了。

是的,你可以使用RTP(它有序列號),但你不需要它。對於你的簡單情況,RTP看起來像是一種矯枉過正。它還有許多其他功能,主要用於多媒體流媒體。

[編輯],類似的問題here