Linux

TCP/IP-over-Ethernet 網路中的延遲

  • September 11, 2012

您會推薦哪些資源(書籍、網頁等):

  • 解釋 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 可能有所不同,因此請注意管理員

確保對您的應用程序和基礎設施進行全面測試。

引用自:https://serverfault.com/questions/215674