如何实现延迟小于 1ms 的 TCP 服务器? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Feiox
V2EX    Linux

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

  •  
  •   Feiox
    feiox 2016-11-29 22:58:52 +08:00 8177 次点击
    这是一个创建于 3303 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    语言 C 平台 GNU/Linux

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

    取消 delayed ack.


    或者直接上 rdma

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

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

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

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

    总之,具体问题具体分析吧,不如 po 段测试代码出来看看。:>
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4170 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 10:10 PVG 18:10 LAX 02:10 JFK 05:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86