提高 Linux 上 socket 效能(轉)

BSDLite發表於2007-08-11
提高 Linux 上 socket 效能(轉)[@more@]使用 Sockets API,我們可以開發客戶機和伺服器應用程式,它們可以在本地網路上進行通訊,也可以透過 Internet 在全球範圍內進行通訊。與其他 API 一樣,您可以透過一些方法使用 Sockets API,從而提高 Socket 的效能,或者限制 Socket 的效能。本文探索了 4 種使用 Sockets API 來榨取應用程式的最大效能並對 GNU/Linux® 環境進行最佳化從而達到最好結果的方法。
在開發 socket 應用程式時,首要任務通常是確保可靠性並滿足一些特定的需求。利用本文中給出的 4 個提示,您就可以從頭開始為實現最佳效能來設計並開發 socket 程式。本文內容包括對於 Sockets API 的使用、兩個可以提高效能的 socket 選項以及 GNU/Linux 最佳化。

為了能夠開發效能卓越的應用程式,請遵循以下技巧:

最小化報文傳輸的延時。
最小化系統呼叫的負載。
為 Bandwidth Delay Product 調節 TCP 視窗。
動態最佳化 GNU/Linux TCP/IP 棧。
技巧 1. 最小化報文傳輸的延時

在透過 TCP socket 進行通訊時,資料都拆分成了資料塊,這樣它們就可以封裝到給定連線的 TCP payload(指 TCP 資料包中的有效負荷)中了。TCP payload 的大小取決於幾個因素(例如最大報文長度和路徑),但是這些因素在連線發起時都是已知的。為了達到最好的效能,我們的目標是使用盡可能多的可用資料來填充每個報文。當沒有足夠的資料來填充 payload 時(也稱為最大報文段長度(maximum segment size) 或 MSS),TCP 就會採用 Nagle 演算法自動將一些小的緩衝區連線到一個報文段中。這樣可以透過最小化所傳送的報文的數量來提高應用程式的效率,並減輕整體的網路擁塞問題。

儘管 John Nagle 的演算法可以透過將這些資料連線成更大的報文來最小化所傳送的報文的數量,但是有時您可能希望只傳送一些較小的報文。一個簡單的例子是 telnet 程式,它讓使用者可以與遠端系統進行互動,這通常都是透過一個 shell 來進行的。如果使用者被要求用傳送報文之前輸入的字元來填充某個報文段,那麼這種方法就絕對不能滿足我們的需要。

另外一個例子是 HTTP 協議。通常,客戶機瀏覽器會產生一個小請求(一條 HTTP 請求訊息),然後 Web 伺服器就會返回一個更大的響應(Web 頁面)。

解決方案

您應該考慮的第一件事情是 Nagle 演算法滿足一種需求。由於這種演算法對資料進行合併,試圖構成一個完整的 TCP 報文段,因此它會引入一些延時。但是這種演算法可以最小化線上路上傳送的報文的數量,因此可以最小化網路擁塞的問題。

但是在需要最小化傳輸延時的情況中,Sockets API 可以提供一種解決方案。要禁用 Nagle 演算法,您可以設定 TCP_NODELAY socket 選項,如清單 1 所示。


清單 1. 為 TCP socket 禁用 Nagle 演算法
QUOTE:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-947131/,如需轉載,請註明出處,否則將追究法律責任。

提高 Linux 上 socket 效能(轉)
請登入後發表評論 登入
全部評論

相關文章