提高 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/,如需轉載,請註明出處,否則將追究法律責任。
請登入後發表評論
登入
全部評論
|
相關文章
- 轉載 ebpf sockmap/redirection 提升 socket 效能(2020)eBPF
- 如何提高Linux伺服器效能Linux伺服器
- GameMode:提高 Linux 遊戲效能的工具GAMLinux遊戲
- Linux socket APILinuxAPI
- Linux中的getrandom()方法效能提高了8450% - PhoronixLinuxrandom
- 轉:在Linux上執行WinFormLinuxORM
- epoll+socket實現 socket併發 linux伺服器Linux伺服器
- Linux Socket C語言網路程式設計:TCP SocketLinuxC語言程式設計TCP
- Linux Socket C語言網路程式設計:UDP SocketLinuxC語言程式設計UDP
- Linux Socket C語言網路程式設計:Select SocketLinuxC語言程式設計
- Linux學習/TCP Socket通訊LinuxTCP
- [轉帖]Linux效能最佳化—記憶體效能篇分享專題Linux記憶體
- Web Socket 效能對比——Spring Boot vs TomWebSpring Boot
- 如何提高前端效能——字型篇前端
- 透過 CancellationToken 提高 Web 效能Web
- 如何提高python程式的效能Python
- 怎樣提高insert的效能
- 在分割槽表上使用正確的索引來提高效能索引
- Linux SOCKET介紹 www.weiboke.onlineLinux
- 從 Linux 原始碼看 socket 的 closeLinux原始碼
- 伺服器的效能如何提高伺服器
- 如何提高 Locust 的壓測效能
- Redis效能提高之批量和管道Redis
- 使用 Traefik 提高 WebSocket 應用效能Web
- Linux Socket C語言網路程式設計:Pthread Socket [code from GitHub, for study]LinuxC語言程式設計threadGithub
- Linux Socket C語言網路程式設計:Poll Socket [code from GitHub, for study]LinuxC語言程式設計Github
- Linux Socket C語言網路程式設計:Epoll Socket [code from GitHub, for study]LinuxC語言程式設計Github
- Linux上使用python處理docx轉pdf教程LinuxPython
- 從linux原始碼看socket(tcp)的timeoutLinux原始碼TCP
- 從Linux原始碼看Socket(TCP)的bindLinux原始碼TCP
- 從Linux原始碼看Socket(TCP)的acceptLinux原始碼TCP
- Web Socket 效能對比——Spring Boot vs Tomcat vs NettyWebSpring BootTomcatNetty
- 提高 PostgreSQL 插入效能的 5 個技巧SQL
- 怎樣提高伺服器的效能伺服器
- 【譯】使用kotlin協程提高app效能KotlinAPP
- 蘋果A13提前曝光:相比A12整體效能提高3倍,AI效能再提高5倍!蘋果AI
- 【Linux網路程式設計】Socket Api函式Linux程式設計API函式
- node js,golang,socket服務返回hello world效能對比JSGolang
- 【Azure 應用服務】Azure App Service For Linux 上實現 Python Flask Web Socket 專案 Http/HttpsAPPLinuxPythonFlaskWebHTTP