>解释TCP / IP-Ethernet网络中延迟的原因;
>提及用于查找导致延迟的事情的工具(例如netstat -s中的某些条目);
>建议调整Linux TCP堆栈以减少TCP延迟的方法(Nagle,套接字缓冲区等).
我所知道的最接近的是this document,但它相当简短.
或者,欢迎您直接回答上述问题.
编辑要明确,问题不仅仅是“异常”延迟,而是关于延迟.此外,它特别是关于以太网上的TCP / IP而不是其他协议(即使它们具有更好的延迟特性).
解决方法
echo 1 > /proc/sys/net/ipv4/tcp_low_latency
If set,the TCP stack makes decisions that prefer lower
latency as opposed to higher throughput. By default,this
option is not set meaning that higher throughput is preferred.
An example of an application where this default should be
changed would be a Beowulf compute cluster.
Default: 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可能不同,因此需要注意管理员.
确保使用您的应用程序和基础结构进行全面测试.