提高 Linux上socket 性能的技巧 最小化報文傳輸延時
本文內容包括Linux下對于 Sockets API 的使用、兩個可以提高性能的 socket 選項以及 GNU/Linux 優化。為了能夠開發性能卓越的應用程序,請遵循以下技巧:最小化報文傳輸的延時;最小化系統調用的負載;為 Bandwidth Delay Product 調節 TCP 窗口;動態優化 GNU/Linux TCP/IP 棧。
最小化報文傳輸的延時:
在通過 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 算法
int sock, flag, ret;
/* Create new stream socket */
sock = socket( AF_INET, SOCK_STREAM, 0 );
/* Disable the Nagle (TCP No Delay) algorithm */
flag = 1;
ret = setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );
if (ret == -1) {
printf("Couldn't setsockopt(TCP_NODELAY)\n");
exit(-1);
}
提示:使用 Samba 的實驗表明,在從 Microsoft Windows 服務器上的 Samba 驅動器上讀取數據時,禁用 Nagle 算法幾乎可以加倍提高讀性能。使用 Sockets API,我們可以開發客戶機和服務器應用程序,它們可以在本地網絡上進行通信,也可以通過 Internet 在全球范圍內進行通信。與其他 API 一樣,您可以通過一些方法使用 Sockets API,從而提高 Socket 的性能,或者限制 Socket 的性能。
【編輯推薦】
- 2.1.3 Socket服務器
- TCP Socket之linux實現
- Linux操作系統下Socket編程地址結構介紹
- 16.5.4 socket編程實例(2)
- 16.5.4 socket編程實例(1)