Linux
TCP/IP-over-Ethernet 網路中的延遲
您會推薦哪些資源(書籍、網頁等):
- 解釋 TCP/IP-over-Ethernet 網路中延遲的原因;
- 提及用於查找導致延遲的事物的工具(例如 中的某些條目
netstat -s
);- 建議調整 Linux TCP 堆棧以減少 TCP 延遲(Nagle、套接字緩衝區等)的方法。
我所知道的最接近的是this document,但它相當簡短。
或者,歡迎您直接回答上述問題。
編輯要清楚,問題不僅僅是關於“異常”延遲,而是關於一般延遲。此外,它專門針對 TCP/IP-over-Ethernet 而不是其他協議(即使它們具有更好的延遲特性。)
關於延遲的核心可調參數,請記住:
echo 1 > /proc/sys/net/ipv4/tcp_low_latency
從文件中:
如果設置,TCP 堆棧會做出更喜歡更低延遲而不是更高吞吐量的決策。預設情況下,未設置此選項意味著首選更高的吞吐量。Beowulf 計算集群是應更改此預設設置的應用程序範例。預設值:0
您還可以在您的應用程序中禁用 Nagle 算法(它將緩衝 TCP 輸出直到最大段大小),例如:
#include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <linux/tcp.h> int optval = 1; int mysock; void main() { void errmsg(char *msg) {perror(msg);exit(1);} if((mysock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { errmsg("setsock failed"); } if((setsockopt(mysock, SOL_SOCKET, TCP_NODELAY, &optval, sizeof(optval))) < 0) { errmsg("setsock failed"); } /* Some more code here ... */ close(mysock); }
此選項的“相反”是
TCP_CORK
,它將“重新 Nagle”數據包。但是請注意,因為TCP_NODELAY
可能並不總是如您所願,並且在某些情況下可能會損害性能。例如,如果您要發送批量數據,您將希望最大化每個數據包的吞吐量,因此設置TCP_CORK
. 如果您有一個需要立即互動的應用程序(或者響應比請求大得多,從而抵消成本),請使用TCP _NODELAY
. 另一方面,這種行為是特定於 Linux 的,而 BSD 可能有所不同,因此請注意管理員。確保對您的應用程序和基礎設施進行全面測試。