提高 Linux 上 socket 效能(轉)
提高 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 演算法
在開發 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效能(轉)Linux
- 提高Linux上小型資料庫的速度(轉)Linux資料庫
- 提高Linux系統效能加速網路應用程式(轉)Linux
- GameMode:提高 Linux 遊戲效能的工具GAMLinux遊戲
- 如何提高Linux伺服器效能Linux伺服器
- 提高java程式效能之垃圾收集 (轉)Java
- 提高MySQL 資料庫效能的思路(轉)MySql資料庫
- 提高SQL效能SQL
- 轉載 ebpf sockmap/redirection 提升 socket 效能(2020)eBPF
- 索引多個資料列提高效能(轉)索引
- Linux中的getrandom()方法效能提高了8450% - PhoronixLinuxrandom
- Linux socket APILinuxAPI
- AIX使用非同步I/O(aio)提高系統效能(轉)AI非同步
- 轉:linux 下mysql指定連線的埠 或socketLinuxMySql
- 提高linux命令列下工作效率(轉)Linux命令列
- MySQL 提高Insert效能MySql
- 如何提高datapump操作效能
- 提高SQL查詢效能SQL
- 提高sql效能的方法SQL
- 如何提高 Ruby On Rails 效能AI
- Linux 效能分析匯總(轉)Linux
- linux效能優化(轉帖)Linux優化
- 優化資料庫大幅度提高Oracle的效能(轉)優化資料庫Oracle
- 使用智慧最佳化器提高Oracle的效能極限 (轉)Oracle
- Linux上的sysctl(轉)Linux
- 通過在Oracle子表外來鍵上建立索引提高效能Oracle索引
- Linux程式設計入門 - socket/inetd programming(轉)Linux程式設計
- Socket高效能IO模型淺析模型
- 透過 CancellationToken 提高 Web 效能Web
- 如何提高前端效能——字型篇前端
- 建立索引——提高SQL Server效能索引SQLServer
- 如何提高 Ruby On Rails 的效能?AI
- 提高sql效能資源(1)SQL
- BSD socket入門(轉)
- LINUX系統效能調諧(轉)Linux
- linux Socket 程式設計Linux程式設計
- linux 檔案系統設定noatime 大幅提高效能Linux
- Linux 系統管理(上)(轉)Linux