linux – TCP / IP-over-Ethernet网络的延迟

前端之家收集整理的这篇文章主要介绍了linux – TCP / IP-over-Ethernet网络的延迟前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
你会推荐哪些资源(书籍,网页等):

>解释TCP / IP-Ethernet网络中延迟的原因;
>提及用于查找导致延迟的事情的工具(例如netstat -s中的某些条目);
>建议调整Linux TCP堆栈以减少TCP延迟的方法(Nagle,套接字缓冲区等).

我所知道的最接近的是this document,但它相当简短.

或者,欢迎您直接回答上述问题.

编辑要明确,问题不仅仅是“异常”延迟,而是关于延迟.此外,它特别是关于以太网上的TCP / IP而不是其他协议(即使它们具有更好的延迟特性).

解决方法

关于延迟的内核可调参数,请记住:
echo 1 > /proc/sys/net/ipv4/tcp_low_latency

documentation

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可能不同,因此需要注意管理员.

确保使用您的应用程序和基础结构进行全面测试.

原文链接:https://www.f2er.com/linux/400621.html

猜你在找的Linux相关文章