美文网首页
韩国客户、读写缓慢和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缓存区

    刚才记录了一个网络问题,一下子就把这个问题想起来了,就顺手记录一下。先说问题表现: 客户通过VPN程序连接到内网 ...

  • Okhttp 数据流

    Okio根据Socket,获取读写缓冲区,负责读写底层Request与Response的Header与Body消息...

  • JavaNIO(八)ByteBuffer和ByteBuf解析

    一 ByteBuffer 1.1 ByteBuffer的内部结构和读写模式 Java nio包提供的原生的缓存区类...

  • I/O事件

    下列情况socket可读: socket内核接收缓存区中的字节数大于或者等于其低水位标记SO_RCVLOWAT。此...

  • 缓存面试题

    什么是缓存? 缓存,就是数据交换的缓冲区,针对服务对象的不同(本质就是不同的硬件)都可以构建缓存。 目的是,把读写...

  • HTTP缓存原理介绍

    通过Internet获取资源既缓慢,成本又高。为此,Http协议里包含了控制缓存的部分,以使Http客户端可以缓存...

  • iOS-Socket基本运用

    Socket使用步骤 创建客户端Socket. 客户端Socket连接到服务器Socket 客户端Socket向服...

  • Redis与数据库的数据一致性问题

    一 读写模式 Cache aside pattern 模式(读写均以缓存为先)1) 读,从缓存读,如果缓存没有,...

  • Socket编程注意点

    Socket注意点 SO_TIMETOUT socket每次读写最多花费的毫秒数socket.setSoTimeo...

  • Socket缓冲区以及阻塞模式

    socket缓冲区每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/sen...

网友评论

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

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