美文网首页
韩国客户、读写缓慢和Socket缓存区

韩国客户、读写缓慢和Socket缓存区

作者: 李书文 | 来源:发表于2016-12-06 17:04 被阅读16次

    刚才记录了一个网络问题,一下子就把这个问题想起来了,就顺手记录一下。
    先说问题表现:

    • 客户通过VPN程序连接到内网
    • 然后通过这条Tunnel 用FTP传输超大的文件
    • 单独上传和下载都没有问题,但是只要同时进行,就有可能直接速度降到0

    解决的思路(都是不成功的):

    • 偶然事件,直接鸵鸟算法,不予理会 。但实际上韩国客户这个问题的重现几率超级大。
    • 在Server端的ip rules太多导致一个包要经过多个Filter从而导致速度太慢
      • 无法解释为什么刚开始很快
      • 而且Linux的iptable效率很高

    最后的原因与解决方案:

    • 在上传和下载同时进行的时候,Socket的缓存区会被瞬间写满
    • 但是我们在处理Socket写的时候并没有用非阻塞的写法,而是用了阻塞的写法
    • 这就造成当上传和下载同时写数据的时候因为缓存区满了,大家都等着另外一方(这里指的是FTP)把数据写完自己写。所以就死锁在这里,速度降到了零
    • 最后在write的时候也对Socket进行Select,只有在是可写状态时才进行写操作,这样就可以了

    P.S. 其实我也没有说的太明白,主要这个问题是别人解决的,我的印象深刻但是细节忽略了不少。
    反正,在考虑高速的网络转发的程序时,一定要用非阻塞的写法,否则死锁的概率很高。

    相关文章

      网友评论

          本文标题:韩国客户、读写缓慢和Socket缓存区

          本文链接:https://www.haomeiwen.com/subject/dmyrmttx.html