V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Feiox
V2EX  ›  Linux

如何实现延迟小于 1ms 的 TCP 服务器?

  •  
  •   Feiox ·
    feiox · 2016 年 11 月 29 日 · 8242 次点击
    这是一个创建于 3335 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设客户端与服务器之间只间隔一层路由(最多两层),或是本地回环,那么如何建立一个 TCP 长连接服务器(以简单的二进制回显服务器为例),使得其响应延迟小于 1ms ? 就是对时延有要求,对吞吐量无要求。

    语言 C 平台 GNU/Linux

    16 条回复    2016-12-01 00:49:40 +08:00
    wtbhk
        1
    wtbhk  
       2016 年 11 月 29 日
    你网络能 1ms ,随便写一个 TCP 服务就是 1ms 啊
    Feiox
        2
    Feiox  
    OP
       2016 年 11 月 29 日
    @wtbhk 可是 ping 值为 0.2ms 左右,但简单写出来的却达到 2ms 的延迟。另外使用 libuv 是不是会加大延迟呢?
    wtbhk
        3
    wtbhk  
       2016 年 11 月 29 日
    @Feiox 是不是建立连接握手的时间也算进去了
    yangqi
        4
    yangqi  
       2016 年 11 月 29 日
    简单写是多简单?难道不是直接用 socket 么
    xuboying
        5
    xuboying  
       2016 年 11 月 29 日 via iPhone
    tcpdump 抓包看
    XiaoxiaoPu
        6
    XiaoxiaoPu  
       2016 年 11 月 29 日   ❤️ 1
    TCP 有 Delayed ACK 还有 Nagle 。 TCP 是面向吞吐量和网络效率设计的,严格要求时延应该用 UDP 。
    xxxyyy
        7
    xxxyyy  
       2016 年 11 月 29 日 via Android   ❤️ 2
    楼上说的对,如果要用 TCP ,可以开启 TCP_NODELAY 试下
    q397064399
        8
    q397064399  
       2016 年 11 月 30 日
    IPC 的方法很多,信号量 共享内存
    不一定要死磕 socket
    k9982874
        9
    k9982874  
       2016 年 11 月 30 日 via iPad
    把你的读写 buffer 设置成 0 试试,提前警告大负载下性能暴降会丢包
    uvhchina
        10
    uvhchina  
       2016 年 11 月 30 日
    这种情况一般上 SCTP 吧
    introom
        11
    introom  
       2016 年 11 月 30 日 via Android
    把 buffer 尽量减小,避免 buffer bloat.

    取消 delayed ack.


    或者直接上 rdma

    或者上 dpdk,netmap,xdp
    est
        12
    est  
       2016 年 11 月 30 日
    万兆网, InfiniBand + TCP
    fiht
        13
    fiht  
       2016 年 11 月 30 日
    只有我一个人想到了锐速么....
    ps: TCP 主要是为了可靠传输,并不怎么讲究传输效率
    sibaru
        14
    sibaru  
       2016 年 11 月 30 日
    这需求自相矛盾,一层路由没有必要用 tcp , tcp 也不保证你的时延
    0987363
        15
    0987363  
       2016 年 11 月 30 日
    既然都内网了,干嘛还用 tcp ,直接 udp 不就行了
    samueldeng
        16
    samueldeng  
       2016 年 12 月 1 日
    看着某些回答也是感觉 V 站💊系列。

    如果 ping 的时延在 0.2ms ,而 TCP 在 2ms ,那么 1.8ms 多半是损耗在了 protocol stack 及以上了。

    如果不动应用层 code 不是楼主维护的话,我想楼主只能从 Linux 内核层面去优化了。
    我倒建议说,首先换网卡 /驱动,先试试 2 层有无优化空间,再如楼上说的,试着调整下 TCP 的参数。

    其次,应用层:考虑到本地环境丢包较少的情况,只需要加快应用层到驱动的处理逻辑,因此,可以考虑说,减小每一层的 Buffer 大小。

    总之,具体问题具体分析吧,不如 po 段测试代码出来看看。:>
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:52 · PVG 06:52 · LAX 14:52 · JFK 17:52
    ♥ Do have faith in what you're doing.