一个服务单  一个客户端1.将服务器,和客户端都在本机上进行传输 很快
本机很快,1s可发几万次2.将服务器放到 局域网内另一台 linux 机器,客户端放到windows 上进行发送的时候就很慢
  将服务器放到 局域网内另一台 windows 机器,客户端放到windows 进行发送,发送效率一样慢客户端:
while(true){一次发送的数据为 (8+15)=23字节,write(23字节);
等服务端得响应 read(16字节);}
服务端:
while(true){
接受,
然后返回 响应 12+4 = 16的字节}客户端发送23字节,循环发送1000次,用时 60s。将socket TcpNodelay设置为true后效率有所提升
发送23字节,循环发送1000次,用时 3s。
settcpnodelay(true)我定位影响效率的原因是 in.read()阻塞导致的.
settcpnodelay(flase)即默认情况下
每次read()耗时 202ms左右,write() 0ms
settcpnodelay(true)即禁用negal算法,
每次read()耗时 1ms 左右,write() 1-3ms左右
偶尔出现一次40ms的情况请教各位大侠,该如何优化,网络传输,read阻塞的情况啊是JVM虚拟机的对socket的网络发送,有限制??小弟先在此谢过!!

解决方案 »

  1.   

    想到两个思路:
    1. 传统IO下设置Socket属性:
       客户端:
       setTcpNoDelay(true)
       setReceiveBufferSize(16)
       setSendBufferSize(23)
       setKeepAlive(true)
       setPerformancePreferences(1,2,0)
       
       服务器:
       setTcpNoDelay(true)
       setReceiveBufferSize(23)
       setSendBufferSize(16)
       setKeepAlive(true)
       setPerformancePreferences(1,2,0)2. 使用NIOlz可以试一下,但是请把最后的结果贴出来哈,我这儿没有环境,只有一台本本
       
      

  2.   


    最新测试结果最新测试结果..settcpnodelay(flase)
    情况下
    在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
    在发送<1500字节的时候  获取响应70字节 循环一1000。。竟然达到 41000ms左右[点击查看原始大小图片]settcpnodelay(true)
    情况下
    在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
    在发送<1500字节的时候  获取响应70字节 循环一1000。。只需800ms左右
      

  3.   


    最新测试结果..settcpnodelay(flase)
    情况下
    在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
    在发送<1500字节的时候 获取响应70字节 循环一1000。。竟然达到 41000ms左右[点击查看原始大小图片]settcpnodelay(true)
    情况下
    在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
    在发送<1500字节的时候 获取响应70字节 循环一1000。。只需800ms左右
    http://dl.iteye.com/upload/attachment/470268/87957deb-bbf0-36e7-81bc-8479984bc615.jpg