论坛首页 Java企业应用论坛

socket 优化传输效率!!高手进

浏览 25284 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-24   最后修改:2011-04-25
一个服务单 一个客户端

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的网络发送,有限制??

小弟先在此谢过!!



最新测试结果..

settcpnodelay(flase)
情况下
在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
在发送<1500字节的时候  获取响应70字节 循环一1000。。竟然达到 41000ms左右



settcpnodelay(true)
情况下
在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
在发送<1500字节的时候  获取响应70字节 循环一1000。。只需800ms左右






附带测试的小程序..
jar包中,包含源程序!
等待各位大侠优化~~
  • 大小: 72 KB
  • 大小: 27.2 KB
  • send.jar (14.3 KB)
  • 描述: send.jar(客户端发送小程序)
  • 下载次数: 269
  • server.jar (14.3 KB)
  • 描述: server.jar(服务端接收小程序)
  • 下载次数: 212
   发表时间:2011-04-24  
20921556 写道
一个服务单 一个客户端

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的网络发送,有限制??

小弟先在此谢过!!

lz
求解   服务器这段时间不间断的出现这个问题
2011-4-24 9:01:51 org.apache.jk.core.MsgContext action
警告: Unable to send headers
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)

0 请登录后投票
   发表时间:2011-04-24  
Broken pipe: 难道并发超过处理能力了。
0 请登录后投票
   发表时间:2011-04-24  
lz的问题,可能跟交换机有关,两个机器用网线连上试试。
0 请登录后投票
   发表时间:2011-04-25  
JMS_Exception 写道
20921556 写道
一个服务单 一个客户端

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的网络发送,有限制??

小弟先在此谢过!!

lz
求解   服务器这段时间不间断的出现这个问题
2011-4-24 9:01:51 org.apache.jk.core.MsgContext action
警告: Unable to send headers
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)


操作系统是怎样的
什么情况下出现的??
0 请登录后投票
   发表时间:2011-04-25  
kimmking 写道
lz的问题,可能跟交换机有关,两个机器用网线连上试试。


摁,我试试先!!
不过交换机是 100M的..应该也不会这么慢的传输效率吧?

用飞鸽传递都还挺快的!
0 请登录后投票
   发表时间:2011-04-25  
设置发送缓存大点。接受缓存也设置大点。好象在默认的情况下。
如:socket.setBuff*
0 请登录后投票
   发表时间:2011-04-25  
read是阻塞的,write是非阻塞的,比较它们的执行时间有意义吗。
0 请登录后投票
   发表时间:2011-04-25  
有没有改成异步read试过?
0 请登录后投票
   发表时间:2011-04-25  
tanjiazhang 写道
有没有改成异步read试过?

貌似 java NIO 就是适合于这种短连接,I/O频繁的场景吧
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics